什麼是多型?
多態就是指一個引用變數倒底會指向哪個類別的實例對象,該引用變數發出的方法呼叫到底是哪個類別中實現的方法,必須在由程式執行期間才能決定。
因為在程式執行時才確定具體的類,這樣,不用修改原始程式碼,就可以讓引用變數綁定到各種不同的類別實作上,從而導致該引用呼叫的具體方法隨之改變,即不修改程式碼就可以改變程式運行時所綁定的具體程式碼,讓程式可以選擇多個運行狀態,這就是多態性。
(免費線上學習影片教學分享:java線上學習)
#特點:
指向子類別的父類引用由於向上轉型了,它只能存取父類別中擁有的方法和屬性,而對於子類別中存在而父類別中不存在的方法,該引用是不能使用的,儘管是重載該方法。
若子類別重寫了父類別中的某些方法,在呼叫該些方法的時候,必定是使用子類別中定義的這些方法(動態連接、動態呼叫)。
Java實作多型有三個必要條件:繼承、重寫、往上轉型。
呼叫的優先權方法,該優先權為:this.show(O)、super.show(O)、this.show((super)O)、super.show((super )O)。
多態的實作原理
Java 裡物件方法的呼叫是依賴類別資訊裡的方法表實現的。
整體而言,當呼叫物件某個方法時,JVM會尋找該物件類別的方法表以決定該方法的直接引用位址,有了位址後才真正呼叫該方法。
超類別繼承父類別的方法,如果不Overriding該方法,那麼呼叫時會指向父類別的方法。如果Overrding該方法,那麼指向該類別的程式碼區,但是超類別會存有父類別的方法表。
我們知道java程式執行時,類別的相關資訊放在方法區,在這些資訊中有個叫方法表的區域,該表包含有該類型所定義的所有方法的資訊和指向這些方法實際程式碼的指標。
如圖:
當Bird、Cock、Parrot和CrazyParrot這四個類別載入到Java 虛擬機器之方法區後,方法區中就包含了這四個類別的信息,下圖範例了各個類別的方法表。
從圖表我們可以看到Cock、Parrot和CrazyParrot的類別資訊方法表包含了繼承自Bird的方法。 CrazyParrot的方法表包含了繼承自Parrot的方法。此外各類別也有自己的方法。
注意看,方法表條目指向的具體方法程式碼區。對於多態性Overriding的方法courtship(),雖然Cock、Parrot和CrazyParrot的方法表裡的courtship()條目所在位置是屬於繼承自Bird方法表的部分,但指向不同的方法代碼區了。
相關文章教學分享:java語言入門
#以上是java中實作多態的原理是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!