天天看點

Thinking in Java 讀書筆記-初始化與清理

構造器

在java中,類的設計者通過提供構造器確定每個對象得到初始化(特殊情況除外,可以将構造器寫成private,這種情況一般出現在設計者不讓開發者随意建立該類對象,如單例模式)。

構造器采用與類相同的名稱,以防止(1)與類的成員名稱重名;(2)讓編譯器知道調用該方法。

構造器是一種特殊類型的方法:無傳回值(不同于void)。

不接受任何參數的構造器叫做預設構造器或者無參構造器,其作用是建立一個預設對象。如果類中沒有構造器,編譯器則會自動建立一個預設構造器。

清理:終結處理和垃圾回收

finalize()方法:在垃圾回收時刻進行的操作。我們隻能保證在垃圾回收時刻會調用finalize()方法,但是不能控制什麼時候進行垃圾回收。決定什麼時候進行垃圾回收的是JVM,因為垃圾回收本身也有開銷,是以可能隻要程式沒有瀕臨存儲空間用完的那一刻,對象的占用空間就總得不到釋放。finalize()不能直接調用。finalize()無法預料,常常是危險的,多餘的。(Effective Java)

垃圾回收器工作原理看到的一篇比較好的文章: Java的記憶體回收機制 引用計數技術:每個對象含有一個引用計數器,當有用用連接配接至對象時,引用計數加1。當引用日開始作用域或者被置null時,引用計數器減1。當發現某個對象的引用計數為0時,就釋放其占用的空間。缺點:無法解決循環應用問題。 其他見超連結。

成員初始化

方法的局部變量必須初始化,否則編譯器會報錯;類成員變量會自動完成預設初始化(置二進制0)。 如果一個對象沒有進行初始化操作就使用則會出現運作時錯誤。 對象建立過程,以Dog類為例:

  1. Dog類的靜态方法/靜态域首次被通路時(包括首次建立Dog對象,因為構造器可以看成靜态方法),java解釋器查找類路徑,以定位Dog.class檔案。
  2. 載入Dog.class,執行靜态初始化的所有動作。靜态初始化隻加載一次。
  3. 當用new Dog()建立對象時,首先将在堆上為Dog對象配置設定足夠的存儲空間。
  4. 這塊空間會被清零,這就自動的将Dog對象中的所有基本類型資料都設定為預設值,而引用則被設定成null。
  5. 執行所有出現于字段定義處的初始化操作。包括自動初始化和執行個體初始化。
  6. 執行構造器。

tips:

  1. 方法重載區分方法:參數類型清單。不能根據傳回值區分重載方法。
  2. this關鍵字傳回目前對象的引用。構造器可以通過this關鍵字調用其他構造器。

繼續閱讀