1. 程式人生 > >Java程式設計思想 第七章讀書筆記

Java程式設計思想 第七章讀書筆記

複用類 思考Java是如何複用程式碼,然後通過複用程式碼來實現更加複雜的邏輯的。

1.組合語法 也就是在新定義的類中引入已經建立類的物件

2.繼承語法 建立一個類的時候總是在繼承,顯示的通過extend 一個已有類,或者是隱式的繼承自Object類。繼承是衍生類完全繼承了父類的域和所有的介面(public方法)。希望不要誤會繼承就是把父類的介面方法和域複製到衍生類中。繼承和複製不同,我們在建立一個子類物件時,會先創造一個父類物件(先有父親再有的兒子嘛),我喜歡把它理解為隱形的建立了一個父類物件,而且子類擁有父類物件的引用。那如何初始化父類物件呢,為了初始化父類物件,需要我們在子類的構造方法中呼叫父類的構造方法,這樣就可以實現父類的初始化。如果父類的構造法是無參構造方法,那麼我們可以省略程式碼去呼叫父類的構造方法(編譯器會幫我們呼叫)。如果父類沒有無引數的構造方法,那麼子類必須顯示的通過super.呼叫父類的構造方法。

3.代理 介於組合和繼承之間。例如我建立了一個類Cat  有一個方法eat()   代理的實現方式是在新類中建立一個 Cat物件,然後實現一個方法 eat(){  cat.eat(); } 通過把Cat的介面都定義一遍然後通過引用cat物件去實現這些介面。代理看上去的效果就是擁有和Cat一樣的介面但是它不是一個Cat。而是通過傳遞,讓真正實現了介面方法。代理相對於繼承的好處是,更加靈活,更多的控制力,因為我們可以選擇只提供在成員物件的方法的某個子集。

4.組合和繼承  是我們常用的方法,不過我們需要堆個別情況保持清醒。我們在處理物件必要的清理時會寫一個清理方法,然而我們繼承一個類的時候要注意呼叫父類清理順序和構造方法的呼叫順序相反,我們要先呼叫子類的清理方法,再呼叫父類的清理方法以防子類呼叫某個方法或者某個引數時異常。

關於重寫,如果基類某個方法已經被重寫很多遍了,那麼在匯出類重新定義該名字的方法,不會遮蔽其在基類的任何版本的方法。通俗點說,假如說父類有了兩個名字一樣的方法(引數列表不同),我在子類中又重寫了一個(引數列表不同於父類的兩個),我相當於子類當中有三個名字相同的方法,它不會覆蓋或者隱藏父類的方法。

5.在組合和繼承之間選擇   。組合和繼承對於實現複雜的類方式有什麼不同有什麼相同?我們通過組合和通過繼承實際上都是放置了子物件,組合是顯示的描述了我們放置的子物件,繼承是隱式的描述。我們使用組合的大部分時候是為了把它當作工具,而我們本身並不需要這個工具的介面,我們只有自己定義的介面。在使用組合的時候我們也需要考慮,是否要將子類物件設定為public或者是private。public 有助於客戶端程式設計師瞭解怎麼樣去使用一個類,降低類開發者的程式碼複雜程度。繼承使用了一個先有類,然後通過繼承實現了這個類的特殊版本,

6.protected關鍵字  :對外界是private 對於自己和繼承類來說是public 

7.向上轉型 表達衍生類和基類的關係,向上轉型是is-a的具體表現。向上轉型是安全的,因為它包含了父類所有介面(向上轉型就是剔除掉出了基類介面以外的介面)。我們在考慮是否需要使用繼承的時候,可以通過思考是否需要向上轉型來回答自己。

8.final 關鍵字 通常表達無法改變的,不想改變出於兩個方面考慮:設計或效率。

final資料:告訴編譯器一塊資料是恆定不變的。常常用作:一個永遠不變的編譯時常量;一個執行時被初始化,而且不希望它改變。對於編譯時常量,編譯器可以將常量值帶入任何需要使用到它的計算當中,在執行計算時減少一些負擔。final修飾的物件引用是為了,當引用被初始化指向一個物件,就無法指向另一個物件了。物件本書的變數是可以修改的。final表達的資料是不變,static修飾的資料表達是獨立於物件。這裡要注意梳理static變數和final變數的初始化時間,static是類第一次建立物件或者是第一次通過類名使用static屬性的時候初始化。而final 修飾的物件可以在執行時初始化。java 允許空final 是指一個成員變數被final修飾但是又沒有指向一個物件,編譯器會確保final修飾的成員變數在使用前被初始化,這樣會更加靈活,為此一個類中的final成員變數就可以做到根據物件不同而有所不同,卻又保持不變的特性。

final引數 Java允許在引數列表中將引數明確為final,這樣意味著無法在方法中修改引數所指引的物件。

final方法 原因:把方法鎖定,以防繼承類修改它的含義,確保在繼承中保持不變;效率,一個方法為final,意味著同意編譯器將針對該方法的呼叫都轉為內嵌呼叫。當編譯器發現一個final方法時呼叫命令時,它會根據自己的謹慎判斷,跳過插入程式碼這種正常方式,而直接執行方法呼叫機制,並以方法實體中的實際程式碼的副本代替方法呼叫。這將消除方法呼叫的開銷。如果一個方法很大,你的程式程式碼就會膨脹,因而可能看不到內嵌帶來的任何效能提高,因為所帶來的效能會因為花費在方法內的時間量而被縮減。

final類 表明這個類不允許被繼承,

9.初始化及類的載入    類是什麼時候載入的?因為一切都是物件,每個類的編譯程式碼存在於每個類的獨立檔案中,該檔案只有在需要的時候才會被載入

在執行一個Java檔案的main方法時,載入器會找到該類的編譯程式碼。在載入該類過程中,發現它有父類,就會去載入父類,根基類的static方法初始化,然後是下一層類的static屬性初始化,最後是匯出類。因為static初始化有可能依賴於基類的成員是否已經初始化。