核心概念
- 抽象類:用
abstract 修飾的類,不能實例化,作為子類公共模板
- 抽象方法:只有聲明無實現的方法,子類必須重寫(除非子類也是抽象類)
語法規則
- 含抽象方法的類必須聲明為抽象類
- 抽象類可包含 0 個或多個抽象方法,也可包含普通方法
- 抽象方法不能用
private、static、final、native 修飾
- 抽象類不能用
final 修飾
- 子類繼承抽象類必須實現所有抽象方法,否則子類也必須聲明為抽象類
完整代碼案例:動物叫聲
abstract class Animal {
String name;
Animal(String name) { this.name = name; }
public abstract void enjoy(); // 抽象方法
}
abstract class Cat extends Animal {
String eyeColor;
Cat(String n, String c) { super(n); this.eyeColor = c; }
// 不實現 enjoy(),繼續聲明為抽象類
}
class BlueCat extends Cat {
BlueCat(String n, String c) { super(n, c); }
@Override public void enjoy() { System.out.println("藍貓叫..."); }
}
class Dog extends Animal {
String furColor;
Dog(String n, String c) { super(n); this.furColor = c; }
@Override public void enjoy() { System.out.println("狗叫...."); }
}
public class TestAbstract {
public static void main(String[] args) {
// Cat c = new Cat("Cat","blue"); // 編譯錯誤:抽象類不能實例化
Dog d = new Dog("dog","black");
d.enjoy(); // 狗叫....
BlueCat bc = new BlueCat("blueCat","blue");
bc.enjoy(); // 藍貓叫...
}
}
設計模式應用:模板方法模式
abstract class DataProcessor {
// 模板方法:定義算法骨架
public final void process() {
readData();
handleData();
writeData();
}
protected abstract void readData();
protected abstract void handleData();
protected abstract void writeData();
}
class XmlProcessor extends DataProcessor {
@Override protected void readData() { /* XML 解析 */ }
@Override protected void handleData() { /* 業務邏輯 */ }
@Override protected void writeData() { /* XML 生成 */ }
}
抽象類 vs 接口
| 特性 | 抽象類 | 接口 |
| 構造方法 | 有 | 無 |
| 成員變量 | 任意 | 隱式 public static final |
| 方法默認實現 | 可有 | Java 8+ default 方法 |
| 繼承/實現 | 單繼承 | 多實現 |
| 適用場景 | 強關聯、共享代碼 | 弱關聯、能力定義 |