abstract class Person {}
class Student extends Person {}
Person p = new Student(); // 為什麼能「實例化」?
並未實例化抽象類 Person。實際發生的是:
new Student():在堆內存創建 Student 具體對象Person p:棧內存聲明 Person 類型引用變量=:將 Student 對象地址賦值給 Person 引用(向上轉型)棧 (Stack) 堆
+----------+ +---------------------+
| p (ref) | ---> | Student Object |
| type:Person| | - Person fields |
+----------+ | - Student fields |
| - vtable -> Student|
+---------------------+
| 概念 | 說明 |
|---|---|
| 類的實例化 | new ConcreteClass() 在堆分配內存,返回對象引用 |
| 引用變量聲明 | ParentType ref; 在棧分配引用槽位 |
| 向上轉型 | ParentType ref = new ChildType(); 子類對象賦值給父類引用 |
| 多態調用 | ref.method() 運行時根據對象實際類型分發 |
Person,而非具體實現 StudentTeacher extends Person 時,使用 Person 類型的代碼無需修改List people = Arrays.asList(new Student(), new Teacher()); Person p = new Student() 中: