天天看點

【Java -- 基礎】多态的實作原理

一、簡介

【Java -- 基礎】多态的實作原理

二、原理

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. 資料存儲方式

【Java -- 基礎】多态的實作原理

b. 引用類型通路實作方式

問:建立對象後,該如何通路對象呢?

實際上需要通路的是 對象執行個體資料 & 對象類型資料

答:Java程式 通過 棧上的引用類型資料(reference) 來通路Java堆上的對象

由于引用類型資料(reference)在 Java虛拟機中隻規定了一個指向對象的引用,但沒定義該引用應該通過何種方式去定位、通路堆中的對象的具體位置

  • 句柄 通路
  • 直接指針 通路