又讀Thinking in Java

前幾天又把Thinking in Java的第五章看了一遍,當然,又是收穫多多,雖然沒有去年第一次看到這本書時的興奮——當時每天很晚下班回宿舍後都是必看一點的,但是也撿起了不少忘掉的東西。


本章的標題是:初始化與清理


首先講述了構造器的由來:在使用對象前,我們都必須確保該對象經過了初始化,那麼可以在每個類中定義一個方法:initialize()(這名字讓人想到了很多設計都用到了名爲init()的這個方法),每次我們使用對象前都先調用一下此方法。那麼問題來了:如果我們忘記了調用怎麼辦呢?出現了問題則必須要有相應的對策來解決,所以人們想到了構造器,讓所有需要初始化的工作都在構造器中完成。那麼構造器又是個什麼東西呢?作者也沒有說,就直接談到了構造器。按照我的理解就是:構造器就是一個方法或者說是一個入口,這個方法是用來創建對象的。然後人們就想辦法設計了這個方法(構造器),定義了一些規則:與類同名,無返回值……這裏作者提到了一句:new表達式確實返回了對新建對象的引用,但是構造器本身並沒有任何返回值。這句話可以讓人好好想想爲什麼構造器沒有返回值了。


創建對象時:先在內存中分配存儲空間,然後調用構造器。


方法重載:Overload。同一個類中多個方法名相同,但參數列表不同。

重載就是爲了偷懶(方便)。

構造器是一個方法,當然也可以重載。

重載的唯一區分方式:獨一無二的參數類型列表。

訪問權限、返回值類型、拋出的異常都不能決定該方法是不是重載的。思考個問題:static方法與同名的實例方法是重載的嗎?


this關鍵字:

this只能在方法內部使用,表示調用該方法的那個對象。在構造器中使用this()方法調用其他構造器。


static關鍵字:static修飾的屬性與方法屬於類所有,該類所有對象共享之。


重點來了:清理內存和垃圾回收

創建對象時有一個初始化過程(雖然該過程被構造器所替代了),那麼放棄使用該對象時也應該有個與之對應的銷燬過程,於是人們爲每個類定義了一個finalize()方法,每次釋放該對象所佔用的內存空間時先調用該方法然後再清理該內存。

記得學C++時有個析構函數,貌似是類名方法前加個~,每次要自己調用該方法來做清理工作,然後Java爲了提高開發人員的工作效率,不再這麼做了,程序員不需要自己調用finalize方法,由Java內部的垃圾回收器根據他們自己定義的條件去執行。

主要講垃圾回收器的工作原理:書上也沒寫個絕對的方法,只是提到了這麼幾種思路。

1、引用計數法:每個對象都有一個引用計數器,每次有引用連接到該對象時將計數器加1,當引用斷開與該對象的連接時計數器減1,當計數器爲0時則將該對象佔用的空間釋放。但是有個缺陷,如果有循環引用,即如果A引用了B,而B又引用了A,那麼這就成了個死結,判斷起來太麻煩,所以這種方法從未被實現過。

2、自適應的技術:遍歷所有的引用,查找活着的對象,然後清理。這也有兩種實現的方法:一、停止然後複製(stop-and-copy):就是將所有存活着的對象複製到一個新的堆中,然後清理原來的堆,這樣要更新所有的引用;二:標記清掃(mark-and-sweep):標記存活的對象,然後將未標記的對象都清理掉,這樣會產生很多碎片空間。兩種方法各有利弊,當然要結合起來用咯。這就涉及到了更多操作系統方面的知識,記得學操作系統時也是講過內存管理的。

再就是提到了一種即時編譯器技術JIT(Just-In-Time):爲了提高效率,使用時才編譯class文件成機器碼。


成員初始化也是一個很重要的點。

寫一個過程吧:首先載入.class文件→創建Class的對象,代表該類文件→所有static成員或代碼塊執行初始化→new一個對象→在堆上分配空間,然後清零該片空間→所有實例變量設置成默認值(8中基本類型+引用類型)→執行字段定義處的初始化動作→執行構造器


數組與可變參數列表


枚舉enum


嗯,就這些了吧~

希望有人能好好交流下,每次看完東西覺得學到了很多,但是一段時間不用就忘了,其實覺得當老師是一份不錯的工作,時刻滾固着再然後用一下,再然後想一下就會有新東西新想法出來了~其實不是有很多成功的人都是當過老師嘛~馬雲、俞敏洪、李陽……(*^__^*) 嘻嘻……自己YY一下




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