abstract class Person {}
class Student extends Person {}
Person p = new Student(); // 編譯通過,運行正常
Student s = new Student(); // 同樣可實例化
new Person() 編譯報錯Person p = new Student()Person 無抽象方法 → Student 繼承後無需實現任何方法 即為具體類Person 有抽象方法,Student 只要全部重寫(或聲明為抽象類),即可實例化Person p = new Student();
棧內存:p (Person 類型引用)
|
v
堆內存:Student 對象 (包含 Person 部分 + Student 部分)
- Person 字段
- Student 字段
- 方法表指針 -> Student 方法表
| 誤區 | 正確理解 |
|---|---|
| 「子類也是抽象類」 | 只有子類用 abstract 修飾,或未實現所有抽象方法時才是抽象類 |
| 「沒重寫方法就不能實例化」 | 父類無抽象方法時,子類無需重寫即可實例化 |
| 「Person p = new Student() 是實例化 Person」 | 實例化的是 Student,賦值給 Person 類型引用(向上轉型) |
abstract class DataProcessor {
public final void process() { // 模板方法
readData();
abstractProcess(); // 抽象步驟
writeData();
}
private void readData() { ... }
private void writeData() { ... }
protected abstract void abstractProcess(); // 子類實現
}
class CsvProcessor extends DataProcessor {
protected void abstractProcess() { /* CSV 處理邏輯 */ }
}
抽象類定義算法骨架,子類填充具體步驟,實例化的是具體子類。
抽象類是不完整的類定義,不能直接創建對象。其非抽象子類補全了所有抽象方法,成為完整類定義,故可正常實例化。多態引用 Parent p = new Child() 是面向對象設計的核心機制。