《java編程思想系列之5》 多態

一、再論向上轉型

向上轉型:對某個對象的引用視爲對其基類的引用

忘記對象類型

二、轉機

1、方法調用綁定

c方法調用:前期綁定
java方法調用:後期綁定

如果一種語言想要實現後期綁定,就必須具有某種機制,以便在運行的時候能夠判斷對象的類型,從而調用恰當的方法。也就說編譯器一直不知道對象的類型,但是方法調用機制能夠找到正確的方法體,並加以調用。

java中除了static和final方法(private方法屬於final方法)之外,其他所有的方法都是後期綁定。

final方法:(1)防止其他人覆蓋該方法 (2)有效的關閉動態綁定

2、產生正確的行爲

3、可擴展性

5、缺陷
(1)“覆蓋”私有方法
結論:只有非private方法纔可以被覆蓋,但是還需要密切注意覆蓋private方法的現象,這時候編譯器雖然不會報錯,但是也不會按照我們期望的來執行。確切的來說,在導出類中,對於基類中的private方法,最好採用不同的名字。

(2)域和靜態方法


如果你直接訪問域,這個訪問就將在編譯期間進行解析。當Sub對象轉型爲Super引用時候,任何域訪問操作都將由編譯器解析,因此不受多態的。

如果某個方法是靜態的,它的行爲就不具有多態性。

三、構造器和多態
1、構造器的調用順序

在導出類的構造器主體中,如果沒有明確指定某個基類構造器,就會“默默”的調用默認構造器。如果不存在默認構造器,編譯器就會報錯(若某個類沒有構造器,編譯器就會自動和成一個默認構造器)。

2、繼承與清理

當覆蓋被繼承的類的dispose()方法的時候,務必要記住調用基類版本的dispose()方法,否則,基類的清理動作就不會發生。

對於基類,應該首先對其導出類進行清理,然後纔是基類。這是因爲導出類的清理可能會調用基類中的某些方法,所以需要使基類中的構件仍然起作用而不是過早的銷燬。

成員對象共享的情況:使用引用計數來跟蹤仍舊訪問着共享對象的對象數量。

3、構造器內部的多態方法的行爲
初始化過程:

1)在其他任何事物發生之前,將分配給對象的存儲空間初始化爲二進制的零
2)調用基類構造器
3)按照聲明的順序調用成員的初始化方法
4)調用導出類的構造器主體

4、協變返回類型

5、用繼承進行設計

優先選擇“組合”

(1)純繼承與擴展
 

導出類的擴展部分不能被基類訪問

2、向下轉型與運行時類型識別

RTTI:運行時類型識別
在java中,所有轉型都會得到檢查

正如示意圖所示,MoreUseful接口擴展了Useful接口;但是由於它是繼承而來的,所以它也可以向上轉型爲Useful類型。我們在main()方法中對數組x進行初始化時候可以看到這種情況的發生。既然數組中的兩個對象都屬於Useful類,所以我們可以調用f()和g()方法。如果我們試圖調用u()方法,就會返回一條編譯時出錯信息。

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