一、複用類的兩種方法java
(1)只需在新的類中產生現有類的對象。因爲新的類是由現有類的對象所組成,因此這種方法稱爲組合。該方法只是複用了現有程序代碼的功能,而非它的形式。ide
(2)第二種方法則更細緻一些,它按照現有類的類型來建立新類。無需改變現有類的形式,採用現有類的形式並在其中添加新代碼。命令行
一、組合技術:只需將對象引用置於新類中便可。對於非基本類型的對象,必須將其引用置於新的類中,但能夠直接定義基本類型數據。代理
二、每個非基本類型的對象都有一個toString()方法,並且當編譯器須要一個String而你只有一個對象時,該方法便會被調用,能夠重寫toString()。對象
三、若是想初始化引用,能夠在代碼中的下列位置進行繼承
(1)在定義對象的地方。這意味着它們老是能在構造被調用以前被初始化。遞歸
(2)在類的構造器中。接口
(3)就在正要使用這些對象以前,這種方式爲惰性初始化。編譯器
(4)使用實例化初始化。編譯
一、除非已明確指出要從其餘類中繼承,不然就是隱式地從java的標準根類Object進行繼承。
二、即便是一個程序中含有多個類,也只有命令行所調用的那個類的mian()方法會被調用。即便不是public類,也能夠執行裏面的面方法。
三、爲了繼承,通常的規則是將全部的數據成員都指定爲private,將全部的方法指定爲public。
四、在子類的方法中,不能直接調用基類繼承而來的方法,由於這樣作會產生遞歸,爲解決此問題,java用super關鍵字表示超類的意思,當前類就是從超類繼承來得。
7.2.1初始化基類
一、當建立一個處處類的對象時,該對象包含了一個基類的子對象。這個子對象與你用基類直接建立的對象是同樣的。兩者的區別在於,後者來自外部,而基類的子對象被包裝在導出類對象內部。
二、對基類子對象初始化:在構造器中調用基類構造器來執行初始化,而基類構造器具備執行基類初始化所須要的全部知識和能力。java會自動在處處類的構造器中插入基類構造器的調用。
三、構建過程是從基類「向外」擴散的,因此基類再導出類構造器能夠訪問它以前,就已經完成了初始化。
四、若是沒有默認的基類構造器,或者想調用一個帶參數的基類構造器,就必須用關鍵字super顯示地編寫調用基類構造器的語句,而且配以適當的參數列表。
5抵用基類構造器必須是你在導出類構造器中要作的第一件事。
一、這是繼承和組合之間的中庸之道,由於咱們將一個成員對象置於所要構造的類中(就像組合),但與此同時咱們在心累中暴露了該成員對象的全部方法(就像繼承)
二、咱們使用代理擁有更多的控制力,由於咱們能夠選擇只提供在成員對象中的方法的某個子集。
一、雖然編譯器強制你去初始化基類,而且要求你在構造器起始處就要這麼作,可是它並不監督你必須將成員對象也初始化,所以在這一點上必須時刻注意。
7.4.1確保正確清理
一、執行類的全部特定的清理動做,其順序同生成順序想法
7.4.2名稱屏蔽
一、當想要覆寫某個方法時,能夠選擇加@Override註解,在你不留心重載而並不是覆寫了該方法時,編譯器就會生成一條錯誤信息。
一、組合技術一般用於想在新類中使用現有類的功能而非它的接口這種情形。
二、在繼承的時候,使用現有類。這意味着你再使用一個通用類,併爲了某種特殊須要而將其特殊化。
一、監管能夠建立protected域,可是最好的方式仍是將域保持爲private,你應當一直保留「更改底層實現」的權利而後經過protected方法來控制類的繼承者的訪問權限。
7.7.1爲何稱爲向上轉型
一、導出類是基類的一個超集。它可能比基類含有更多的方法,但他必須至少具有基類中所含有的方法。
7.7.2再論組合與集成
一、若是必須向上轉型,則繼承是必要的。
7.8.1final數據
一、有時數據的恆定不變是頗有用的
(1)一個永不改變的編譯時常量
(2)一個在運行時被初始化的值,而你不但願它被改變
二、一個既是static又是final域只佔據一段不能改變的存儲空間(編譯期常量)。
三、對於基本類型,final使數值恆定不變,而用於對象引用,final使引用恆定不變。
四、既是static又是final的域,將用大寫表示,並使用下劃線分割各個單詞。
五、不能由於某數據是final的就認爲在編譯時能夠知道它的值。由於它能夠在運行時再賦值。
六、將final數值定義爲靜態和非靜態的區別:此區別只有當數值在運行時內被初始化才顯現,這是由於編譯器對編譯時數值一視同仁。
七、final參數:指明爲final的參數,能夠讀參數,單不能修改參數。
7.8.2final方法
一、使用緣由
(1)把方法鎖定,以防任何繼承類修改它的含義。
(2)過去建議使用final方法是由於效率(如今不存在了)
二、當基類的某方法爲private時,再寫一個同名方法,此時並無覆蓋該方法,僅是生成了一個新的方法。
7.8.3final類
一、因爲final類禁止繼承,因此final類中的全部的方法都隱式指定爲final。
一、加載順序:先基類的static,再子類的static。
二、建立順序:先子類的構造器,再基類的構造器。