標籤:子類 種類型 處理 extend 最好 動態 錯誤 體系 向上轉型
前言:
封裝:通過合并特徵和行為建立新的資料類型。
實現隱藏:通過將細節“私人化”,把介面和實現分離。
多態:消除類型間的耦合關係。也稱作動態綁定,後期綁定或運行時綁定。
8.1再論向上轉型:
對象既可以作為本身的類型使用,也可以作為基類的類型使用。這種做法成為向上轉型。
其代碼錶現就是:父類引用指向子類。
多態允許在參數的地方使用,即參數處聲明基類,用於接受基類或匯出類實現。
8.2轉機(主要是介紹如何?多態)
為瞭解決多態問題,在java中提供了後期綁定的方法,即在運行時根據對象的類型進行綁定。也成為動態綁定或運行時綁定。
註:java中除了static方法和final方法,其他方法都是後期綁定。final關鍵字可以關閉動態綁定。
final關鍵字最好根據設計來決定是否使用。千萬不能通過final來提高效能,因為並不會提升效能,而且也會讓程式的設計顯得混亂。
多態可以讓程式員將:改變的事物與未變的事物分離開來。
這裡再次提高了試圖重寫基類的private方法是一種很錯誤的行為。
只有普通方法的調用是多態的,靜態方法不具有多態性(實際上final也沒有,而且由於private隱式指向final,所以也沒有)。
8.3構造器與多態
構造器是不具有多態的,他們本質上是static方法,只不過是隱式聲明。
前面提到過:基類的構造器總是在匯出類的構造過程中被調用,且按照繼承層次逐漸向上調用。
對於複雜的繼承體系:
1)調用基類的構造器
2)按聲明順序調用成員變數的初始化方法。
3)調用匯出類的構造器本體。
註:繼承體系中,為什麼這樣調用?因為在匯出類中要求基類是已經存在的,且基類的一切成員(public protect)都可以訪問到。
涉及到記憶體方面的構造過程:
1)將分配給對象的儲存空間初始化成二進位的零。
2)調用基類構造器。
3)按照聲明的順序調用成員的初始化方法。
4)調用匯出類的構造器主體。
實際上構造器中,除了初始化成員外,唯一能夠安全調用的方法是基類的final方法了(也適用於private方法,他們隱式為final)。
8.4協變傳回型別:
這是jdk1.5中。
匯出類的被覆蓋的方法可以返回基類方法的傳回型別的某種匯出類型。
8.5用繼承進行設計:
實際上是表明了在繼承用於設計的時候,一定要謹慎,:
繼承要求在編譯時間就要知道確切的類型。
用繼承表達行為間的差異,並用欄位表達狀態上的改變。
純繼承與擴充:
純繼承是is-a的關係:基類可以接受發送匯出類的任何訊息,因為二者有著完全相同的介面。我們只需要從匯出類向上轉型,永遠不需要知道正在處理的對象的確切類型。
實際上extends用於擴充介面,這樣是一種is-like-a的關係。匯出類就像一個基類,除了有著同基類相同的介面外,還有自己額外方法實現的特性。
匯出類中介面的擴充部分不能被基類訪問。對於這種類型,在向上轉型時的問題就在於,擴充部分不能被基類訪問。
為瞭解決向上轉型中,無法識別擴充部分,提出了向下轉型的概念。
但是有可能出現的問題:你不知道到底要轉成哪個類型。這時候就會出現運行期異常:(ClassCastException)。
實際上在java中每一次轉型都會的得到檢查,稱之為“運行時類型識別”(RTTI)。
java編程思想第八章多態