一、簡介
二、原理
2.1 實作原理
通過将 子類對象執行個體 指派給 父類引用變量,使得編譯時的靜态變量和運作時的動态變量不一樣,在實作動态方法調用時,多态就發生了
2.2 應用示例
// 設 B類是A類的子類
A b = new B(); //編譯時變量 = A b 、運作時變量 = new B()
b.name; // 調用了父類A的成員變量name
b.move(); // 調用的是子類B重寫後的2個方法move()、content()
b.content();
// 結論:因将 子類對象引用 指派給 父類對象變量,即A a = new B(),即 編譯時變量和運作時變量不一樣,是以多态發生
2.3 實作過程(直接指針 通路)
JVM 虛拟機通過 引用類型(reference,即A的引用)查詢Java棧中的本地變量表
得到堆中的對象類型資料的位址
根據位址,進而找到方法區中的對象類型資料(B的對象類型資料)
查詢 對象類型資料中的方法表 定位到 實際類(B類)的方法,進而運作
注:基礎知識補充
要充分了解多态的實作過程,還需了解以下JVM的基礎知識
對于:A a = new B()
a. 資料存儲方式
b. 引用類型通路實作方式
問:建立對象後,該如何通路對象呢?
實際上需要通路的是 對象執行個體資料 & 對象類型資料
答:Java程式 通過 棧上的引用類型資料(reference) 來通路Java堆上的對象
由于引用類型資料(reference)在 Java虛拟機中隻規定了一個指向對象的引用,但沒定義該引用應該通過何種方式去定位、通路堆中的對象的具體位置
- 句柄 通路
- 直接指針 通路