首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 抽象類實例化與多態:父類引用指向子類對象機制

     編輯:程式設計綜合問答

問題代碼

abstract class Person {}
class Student extends Person {}

Person p = new Student(); // 為什麼能「實例化」?

核心澄清

並未實例化抽象類 Person。實際發生的是:

  1. new Student():在堆內存創建 Student 具體對象
  2. Person p:棧內存聲明 Person 類型引用變量
  3. =:將 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,而非具體實現 Student
  • 可擴展性:新增 Teacher extends Person 時,使用 Person 類型的代碼無需修改
  • 集合存儲:List people = Arrays.asList(new Student(), new Teacher());

總結

Person p = new Student() 中:

  • 實例化的是 Student(具體類)
  • 引用類型是 Person(抽象類/父類)
  • 這是多態的基礎語法,非抽象類實例化
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved