Thinking in Java 學習筆記 三

對於類的清理,首先在於按照一定次序銷燬成員變量,但是對於有些類,創建了多個對象,有的變量在多個對象中被引用(無法銷燬),清理工作變得複雜,需要計數器來記錄創建的對象數目 。

 

構造器是隱性static,private是隱性final。記住這兩點有助於理解許多問題。


一個兩難的問題:構造器用於創建對象,需要在對象被創建時調用。對於多態 ,如類中的對象方法綁定,直到運行時才能確定(也只有這樣,才能發揮多態的效力)。如果在構造器中調用多態方法,會有什麼樣的結果?構造執行之時,整個對象之時初始化一半,直接調用的結果可能使用了未初始化的變量,這將造成風險 。


簡單來說,一個類、方法最終被編譯爲中間代碼(可能是本機環境的彙編),然後編譯爲可以運行的執行代碼,對於最後生成的代碼而言畢竟是寫死的了,所爲多態的實現,運行時確定的概念又有什麼意義?多態的概念應該只是對於一個類、一個方法而言的,對於整個項目,沒有什麼是不能確定的(隨機忽視);對與類、方法而言,它自身確實不能確定傳入的參數是原型還是向上轉型的產物,此即多態。


初始化的順序:
1) 在其他任何事物發生之前 ,將分配給對象的存儲空間初始化成二進制的零 。
2) 調用基類的構造器。如有與子類同名的方法(覆蓋),調用的爲覆蓋的方法。
3) 按照聲明的順序調用成員初始化方法 。
4) 調用子類的構造器。


由於基類中調用方法可能會產生不確定性(因爲你也不知道什麼時候自己會變成基類,你的public或protected方法被覆蓋了~),最好在構造器中調用final(不可覆蓋)或private(隱性final)的方法。這是爲了避免未知的錯誤(在C++中的表現更爲合理些)。


Java SE5之後的新特性:協變返回類型。之前強制返回類型、參數 、方法名都一致才能形成覆蓋。新特性允許,覆蓋方法的返回類型可以是子類(而非強制基類)


多態是繼承靈活應用的表現,但是在設計之初考慮繼承會加重設計負擔 ,還有優先使用組合來解決問題。組合、繼承的關係也是耦合的話,繼承是強關係(編譯時確定),組合要若上很多(在運行時仍然可以改變)


Java提供抽象方法的機制,abstract關鍵字,包含一個或多個抽象方法的類稱爲抽象類。(不限定編譯報錯),對於抽象類編譯器限定無法創建對象。


一個接口 表示:所有實現了這個接口的類看起來都像這樣。Java沒有多重繼承,但實現多個接口可以實現這個需要,相比C++,這樣的優勢在於,interface都是沒有任何實現的類,這樣就避免了多個基類中相同方法實現間的衝突。在組合類與接口的時候,類必須放在前面聲明,後面纔跟着接口。


放入接口中的任何域都是默認隱式static和final的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章