《java編程思想》學習筆記——多態

8.1再論向上轉型

一、多態經過分離作什麼和怎麼作,從另外一角度將接口和實現分離開來。java

二、「封裝」經過合併特徵和行爲來建立新的的數據類型。「實現隱藏」則經過細節「私有化」把接口和實現分離開來。設計

三、繼承容許將對象視爲它本身自己的類型或其餘類型來加以處理。對象

8.2起色

8.2.1方法調用綁定

一、將一個方法調用同一個方法主體關聯起來被稱做綁定,若在程序執行前進行綁定(若是有的話,由編譯器和鏈接程序實現),叫作前期綁定。繼承

二、後期綁定也叫作動態綁定或運行時綁定。編譯器一直不知道對象的類型,可是方法調用機制能找到正確的方法,並加以調用。 三、java中除了static方法和final方法(private方法屬於finla方法)以外,其餘全部的方法都是後期綁定。接口

四、爲何要將某個方法聲明爲final呢?編譯器

(1)防止其餘人覆蓋該方法。編譯

(2)這樣作能夠有效的「關閉」動態綁定,或者說,告訴編譯器不須要對其進行動態綁定。擴展

8.2.2產生正確的行爲

8.2.3可擴展性

8.2.4缺陷:「覆蓋」私有方法

一、private方法被自動認爲是final方法,並且對導出類是屏蔽的。權限

二、只有非private才能能夠被覆蓋。數據類型

8.2.5缺陷:域與靜態方法

一、只有普通的方法調用能夠是多態的。例如:若是你要直接訪問某個域,這個訪問將在編譯期進行解析。

二、若是某個方法是靜態的,它的行爲就是不具備多態性。

8.3構造器和多態

一、構造器並不具備多態性(它們其實是static方法,只不過該static聲明是隱式的)

8.3.1構造器的調用順序

一、基類的構造器老是在導出類的構造過程當中被調用,並且按照繼承層次主鍵向上連接,以使每一個基類的構造器都能獲得調用。這是由於:構造器具備一項特殊任務,檢查對象是否被正確地構造。

二、只有基類的構造器才具備恰當的知識和權限來對本身的元素進行初始化,所以必須令全部構造器獲得調用,不然就不可能構造完整對象。

三、複雜對象調用構造器要遵守下面的順序

(1)調用基類構造器

(2)按順序調用成員的初始化方法

(3)調用導出類構造器的主體

若遵循這一規則,那麼就能保證全部基類成員以及當前對象的成員對象都被初始化了。

8.3.2繼承與清理

一、銷燬的順序應該和初始化順序相反。

8.3.3構造器內部的多態方法的行爲

一、若是在一個構造器的內部調用正在構造的對象的某個動態綁定方法,會發生什麼狀況呢?

如書上的例子:調用Glyph構造器的時候,Glyph。draw()方法被子類的方法覆蓋,因此實際調用的是子類的方法,單radius還沒被初始化,因此radius=0

二、編寫構造器時有一天有效的準則:用盡量的方法是對象進入正常狀態,若是能夠的話,避免調用其餘方法

8.4協變返回類型

一、她表示在導出類的被覆蓋方法能夠返回基類方法的返回類型的某種導出類型。

8.5用繼承進行設計

一、用繼承表達行爲間的差別,並用字段表達狀態上的變化。

相關文章
相關標籤/搜索