具體類對應具體對象;抽象類 表達抽象概念,是具體類的上層父類,不能實例化。例如:狗是具體對象,動物是抽象概念;正方形是具體,圖形是抽象。
抽象方法只有聲明無實現,用 abstract 修飾。包含抽象方法的類必須聲明為抽象類。抽象類可包含具體方法、實例變量。
public abstract class Shape {
public abstract void draw(); // 抽象方法
public void move() { ... } // 具體方法
}
子類繼承抽象類必須實現所有抽象方法,否則子類也得聲明 abstract。雖不能 new Shape(),但可聲明抽象類類型變量引用具體子類對象:
Shape shape = new Circle(); // Circle 實現了 draw() shape.draw(); // 動態調用 Circle.draw()
不是語法必需,而是工程防禦機制:
好工具讓普通人也難犯錯,這是語言設計的智慧。
接口定義能力(What),抽象類提供默認實現(How)。一個類可實現多接口,但只能單繼承。常見模式:
Collection 接口 + AbstractCollection 抽象類List + AbstractListMap + AbstractMap實現接口有兩條路:
implements 接口,全量實現。extends 抽象類,選擇性重寫(復用代碼,工作量少)。若類已有父類,只能選擇路徑 1。
// 接口定義能力
public interface IAdd {
void add(int number);
void addAll(int[] numbers);
}
// 抽象類提供默認實現
public abstract class AbstractAdder implements IAdd {
@Override public void addAll(int[] numbers) {
for (int n : numbers) add(n); // 依賴抽象方法 add()
}
}
// 具體類繼承抽象類,僅實現核心邏輯
public class Base extends AbstractAdder {
private static final int MAX = 1000;
private int[] arr = new int[MAX];
private int count;
@Override public void add(int number) {
if (count < MAX) arr[count++] = number;
}
}
抽象類表達不完整概念,配合接口實現「能力定義 + 骨架實現」分離,減少誤用、提升復用。下一節將探討內部類:為什麼要把類放在另一個類裡?
關注微信公眾號「老馬說編程」獲取最新連載。
