多態的實現

面向對象編程有三大特性:封裝、繼承、多態。

    封裝隱藏了類的內部實現機制,可以在不影響使用的情況下改變類的內部結構,同時也保護了數據。對外界而已它的內部細節是 隱藏的,暴露給外界的只是它的訪問方法。

    繼承是爲了重用父類代碼。兩個類若存在IS-A的關係就可以使用繼承。,同時繼承也爲實現多態做了鋪墊。

    多態就是指程序中定義的引用變量所指向的具體類型通過該引用變量發出的方法調用在編程時並不確定,而是在程序運行期間才確定,即一個引用變量倒底會指向哪個類的實例對象,該引用變量發出的方法調用到底是哪個類中實現的方法,必須在由程序運行期間才能決定。因爲在程序運行時才確定具體的類,這樣,不用修改源程序代碼,就可以讓引用變量綁定到各種不同的類實現上,從而導致該引用調用的具體方法隨之改變,即不修改程序代碼就可以改變程序運行時所綁定的具體代碼,讓程序可以選擇多個運行狀態,這就是多態性。

    

比如你是一個酒神,對酒情有獨鍾。某日回家發現桌上有幾個杯子裏面都裝了白酒,從外面看我們是不可能知道這是些什麼酒,只有喝了之後才能夠猜出來是何種酒。你一喝,這是劍南春、再喝這是五糧液、再喝這是酒鬼酒….在這裏我們可以描述成如下:

      酒 a = 劍南春

      酒 b = 五糧液

      酒 c = 酒鬼酒

      …

      這裏所表現的的就是多態。劍南春、五糧液、酒鬼酒都是酒的子類,我們只是通過酒這一個父類就能夠引用不同的子類,這就是多態——我們只有在運行的時候纔會知道引用變量所指向的具體實例對象。

      

Wine a = new JNC();

      在這裏我們這樣理解,這裏定義了一個Wine 類型的a,它指向JNC對象實例。由於JNC是繼承與Wine,所以JNC可以自動向上轉型爲Wine,所以a是可以指向JNC實例對象的。這樣做存在一個非常大的好處,在繼承中我們知道子類是父類的擴展,它可以提供比父類更加強大的功能,如果我們定義了一個指向子類的父類引用類型,那麼它除了能夠引用父類的共性外,還可以使用子類強大的功能。

      但是向上轉型存在一些缺憾,那就是它必定會導致一些方法和屬性的丟失,而導致我們不能夠獲取它們。所以父類類型的引用可以調用父類中定義的所有屬性和方法,對於只存在與子類中的方法和屬性它就望塵莫及了---1。若子類重寫了父類方法,那指向子類的父類引用會調用子類中被重寫的方法。

      指向子類的父類引用由於向上轉型了,它只能訪問父類中擁有的方法和屬性,而對於子類中存在而父類中不存在的方法,該引用是不能使用的,儘管是重載該方法。若子類重寫了父類中的某些方法,在調用該些方法的時候,必定是使用子類中定義的這些方法(動態連接、動態調用)。

     對於面向對象而已,多態分爲編譯時多態和運行時多態。其中編輯時多態是靜態的,主要是指方法的重載,它是根據參數列表的不同來區分不同的函數,通過編輯之後會變成兩個不同的函數,在運行時談不上多態。而運行時多態是動態的,它是通過動態綁定來實現的,也就是我們所說的多態性。


多態的實現條件

       Java實現多態有三個必要條件:繼承、重寫、向上轉型。

        對於Java而言,它多態的實現機制遵循一個原則:當超類對象引用變量引用子類對象時,是由被引用對象的類型而不是引用變量的類型決定調用誰的成員方法,但是這個被調用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法。

多態的實現形式

      在Java中有兩種形式可以實現多態。繼承和接口。

       繼承是通過重寫父類的同一方法的幾個不同子類來體現的,那麼就可就是通過實現接口並覆蓋接口中同一方法的幾不同的類體現的。

        在接口的多態中,指向接口的引用必須是指定這實現了該接口的一個類的實例程序,在運行時,根據對象引用的實際類型來執行對應的方法。

      當超類對象引用變量引用子類對象時,被引用對象的類型而不是引用變量的類型決定了調用誰的成員方法,但是這個被調用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法,但是它仍然要根據繼承鏈中方法調用的優先級來確認方法,該優先級爲:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。this即指引用類型,若B繼承於A,對於A a=new B();而言,a爲引用變量,爲A類型,引用的是B對象,this指向A。先到this中找參數爲O的方法,然後到this的超類中找,然後到this中找參數爲O的超類的方法,最後到this的超類中找參數爲O的超類的方法。需要注意的是,當在this中找到對應的方法後,若子類重寫了對應的方法則實際調用子類方法。



發佈了27 篇原創文章 · 獲贊 48 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章