《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()方法,就會返回一條編譯時出錯信息。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.