Java多態概述:(建議:java視訊教學)
多態是物件導向程式語言的重要特性,它允許基類別的指標或引用指向衍生類別的對象,而在特定存取時實作方法的動態綁定。 Java 對於方法呼叫動態綁定的實作主要依賴方法表,但透過類別參考呼叫(invokevitual)和介面參考呼叫(invokeinterface)的實作則有所不同。
java中實作多態需要三個條件:
1、需要有繼承關係的存在。
2、需要有方法的重寫。
3、需要有父類別的參考指向子類別物件。
類別引用呼叫的大致過程為:Java編譯器將Java原始碼編譯成class文件,在編譯過程中,會根據靜態型別將呼叫的符號參考寫到class文件中。
在執行時,JVM根據class檔案找到呼叫方法的符號引用,然後在靜態類型的方法表中找到偏移量,然後根據this指標確定物件的實際類型,使用實際類型的方法表,偏移量跟靜態類型中方法表的偏移量一樣,如果在實際類型的方法表中找到該方法,則直接調用,否則,認為沒有重寫父類該方法。依照繼承關係從下往上搜尋。
從上圖可以看出,當程式運作時,需要某個類別時,類別載入子系統會將對應的class檔案載入到JVM中,並且在內部建立該類別的類型資訊(這個類型資訊其實就是class檔案在JVM中儲存的一種資料結構),包含java類別定義的所有信息,包括方法代碼,類別變數、成員變數、以及本博文要重點討論的方法表。這個類型資訊就儲存在方法區。
注意,這個方法區中的型別資訊跟在堆中存放的class物件是不同的。在方法區中,這個class的型別資訊只有唯一的實例(所以是各個執行緒共享的記憶體區域),而在堆中可以有多個該class物件。可以透過堆中的class物件存取到方法區中類型資訊。就像在java反射機制那樣,透過class物件可以存取到該類別的所有資訊一樣。
更多java知識請關注java基礎教學欄。
以上是java如何實現多型的詳細內容。更多資訊請關注PHP中文網其他相關文章!