4: Initialization & Cleanup(初始化與清理)

用構造函數確保初始化
注意,編程風格要求的方法的首字母要小寫的要求不適用于構造函數,因為構造函數的名字必須與類的名字完全相同。
構造函數是一種特殊的方法,它沒有返回值。這一點同void型的方法有著本質上的區別,void型的方法什么都不返回,但這是你決定的,你也可以讓它返回些什么。而構造函數則什么都不返回,而且你別無選擇(new表達式確實會返會返回這個新創建的對象的reference,但是構造函數本身不返回任何值)。如果構造函數能有返回值,而且你還可以選擇這個值,那么編譯器就要問了,它應該怎樣處置這個返回值。

方法的重載
區分經過重載的方法
即使是參數順序的顛倒也足以將兩個方法區分開來。(不過,通常情況下別用這種辦法,因為這會產生難以維護的代碼。)
對primitive進行重載
如果實參(真正調用方法的那個參數)的類型比形參(方法的定義中所聲明的參數)的類型小,那么數據會先提升。
如果你傳的參數比它大,那么你就只能把它轉換成這個類型的值。把類型的名字放在括號里就行了。不這么做,編譯器就會報錯。
用返回值重載
調用方法的時候是可以忽略返回值的。由于你并不關心方法調用所返回的值,而只想利用其副作用,因此這通常被稱為“為利用其副方法而調用方法(calling a method for its side effect)”。因此,不能用返回值來區分重載的方法。
默認的構造函數
如果你寫了一個沒有構造函數的類,那么編譯器會自動為你創建一個默認的構造函數。但是,只要定義了構造函數(不管帶不帶參數),編譯器就不會再自動合成默認的構造函數了。
this關鍵詞
this關鍵詞只能用于方法內部,它負責返回調用這個方法的對象的reference。記住,如果你想在別的類的方法里調這個類的方法,那么無須使用this,直接調用就是了。當前對象的this會自動地用于其它方法。this只應用于那些,你明確指明要使用對象的reference的特殊情況。
在構造函數里調用構造函數
可以用this調用一個構造函數,但是不能調用兩個。此外,你還得在程序的最前面調用構造函數,否則編譯器就會報錯。
參數s的名字和類的數據成員s的名字相同,于是就產生了二義性。你可以用this.s來解決這個問題。它表示你要用類的數據成員。
編譯器不會讓你在方法里調用構造函數,除非它自己就是構造函數。
static的含義
類的static方法只能訪問其它static方法和static數據成員。
static方法有全局函數的意思,因此它不是面向對象的;你不能用static方法向對象發消息,因為它沒有this。如果你發現用了很多static方法,那么你大概得重新思考一下你的設計策略了。

清理:finalization和垃圾回收
1. 對象不一定會被垃圾回收器回收。
2. 垃圾回收不是拆構(destruction)。
為什么要有finalize()?
3. 垃圾回收只與內存有關。
不論對象是以什么方式創建的,內存釋放都是由垃圾回收器負責的。只有在一些非常特殊的場合才會需要用到finalize(),這種場合就是內存是以創建對象以外的形式被分配給對象時。
你必須親自進行清理
記住,垃圾回收和finalize()都是靠不住的。只要JVM還沒到快要耗盡內存的地步,它是不會浪費時間來回收垃圾以恢復內存的。
中止條件
垃圾回收器是如何工作的

自適應的,分代的,停止和拷貝,標識和清掃。

成員的初始化
如果變量是在方法內部定義的局部變量,這種保障就表現為編譯時的錯誤信息。
指定初始化
用構造函數進行初始化
你并沒有排除自動的初始化,它在構造函數運行之前就已經完成了。
初始化的順序
變量的定義可能分散在類定義的各個地方,并且與方法的定義相互交錯,但是變量的初始化會先于任何方法,甚至是構造函數的調用。
靜態數據的初始化
只有創建了第一個對象之后(或者第一次訪問static成員的時候),它們才會被初始化。此后,static對象就不會再作初始化了。如果先前沒有創建過這種對象,因而其static的成員尚未初始化的話,初始化會先處理其static成員,再處理非static的對象。
1. 第一次創建Dog類的對象(構造函數實際上是static方法),或者第一次,訪問Dog類的static的方法或字段的時候,Java解釋器會要搜尋classpath,找到Dog.class。
2. 裝載了Dog.class之后(創建了Class對象之后),會對所有的static數據進行初始化。這樣第一個裝載 Class對象的時候,會先進行static成員的初始化。
3. 用new Dog()創建新對象的時候,Dog對象的構建進程會先在堆里為對象分配足夠的內存。
4. 這塊內存先被清零,這樣就自動地把Dog對象的primitive類型的成員賦上缺省的值(對于數字就是零,或者是相應的boolean和char),將reference設成null。
5. 執行定義成員數據時所作的初始化。
6. 執行構造函數。這可能會牽涉到相當多的活動,特別時有繼承的時候。
顯式的靜態初始化
非靜態的實例初始化

這種語法為匿名內部類(anonymous inner class)的初始化提供了必不可少的支持。

數組的初始化
多維數據

總結

練習

「讀書筆記」Thinking in Java 3rd Edition - 5: Hiding the Implementation