版權聲明:請尊重個人勞動成果,轉載注明出處,謝謝!
多态 同一個類的不同表現形态,不同的形态是通過其不同的子類展現 <a href="http://blog.csdn.net/amazing7/article/details/51219687">面向對象的三個特征與含義</a>
下面看例子:
類b是類a的子類, a a = new b() 編譯時變量和運作時變量不一樣,是以多态發生了。
① a a 作為一個引用類型資料,存儲在jvm棧的本地變量表中。
② new b()作為執行個體對象資料存儲在堆中
B的對象執行個體資料(接口、方法、field、對象類型等)的位址也存儲在堆中
B的對象的類型資料(對象執行個體資料的位址所執行的資料)存儲在方法區中,方法區中 對象類型資料 中有一個指向該類方法的方法表。
③java虛拟機規範中并未對引用類型通路具體對象的方式做規定,目前主流的實作方式主要有兩種:
1. 通過句柄通路
在這種方式中,jvm堆中會專門有一塊區域用來作為句柄池,存儲相關句柄所執行的執行個體資料位址(包括在堆中位址和在方法區中的位址)。這種實作方法由于用句柄表示位址,是以十分穩定。
2.通過直接指針通路
通過直接指針通路的方式中,reference中存儲的就是對象在堆中的實際位址,在堆中存儲的對象資訊中包含了在方法區中的相應類型資料。這種方法最大的優勢是速度快,在hotspot虛拟機中用的就是這種方式。
④實作過程
首先虛拟機通過reference類型(a的引用)查詢java棧中的 本地變量表,得到堆中的 對象類型資料的位址,進而找到方法區中的 對象類型資料(b的對象類型資料) ,然後查詢方法表定位到實際類(b類)的方法運作。