第五章、初始化和清理
5.1 構造器方法
特徵:語法上無返回字段(比如void),並用於放置對象初始化的相關代碼塊。
5.2 方法重載(method overloading)
方法名相同,形式參數列表不同(參數列表又叫參數簽名,包括參數的類型、參數的個數和參數的順序,只要有一個不同就叫做參數列表不同)。重載是面向對象的一個基本特性。
a. 聲明為final的方法不能被重載。
b. 聲明為static的方法不能重載,但是能夠被再次聲明。
c. 重載方法的返回類型可以相同也可以不同,但僅返回類型不同不足以成為方法重載。
d. 編譯器根據調用方法的簽名逐個匹配,以選擇對應方法的過程叫做重載分辨(Overload Resolution,或叫重載決議)。
5.3 this 關鍵字
`this` 關鍵字只能在方法內部使用,表示對“**調用方法的那個對象**”的引用。
5.4 清理:終結處理和垃圾回收
5.4.1 finalize()
a. Java中的finalize()不等於C++中的析構函數(不一定會執行);
Java並未提供“析構函數”或相似的概念,Java的“垃圾回收”不保證一定會發生,所以要做類似的清理工作,必須自己動手創建一個執行清理工作的普通方法。
只要程序沒有瀕臨存儲空間用完的那一刻,垃圾回收可能就會一直沒有發生。這個策略是恰當的,因為垃圾回收本身也有開銷,要是不使用它,那就不用支付這部分開銷了。
b. 當發生“垃圾回收”時,finalize()才得到調用;
c. Java裡的對象並非總是被垃圾回收(因為Java的“垃圾回收”並不能保證一定會發生)
對象可能不被垃圾回收;
5.4.2 finalize()用途何在
a. 由於垃圾回收器會負責釋放對象佔據的所有內存,這就將finalize()的需求限制到一種特殊情況,即通過某種創建對象方式以外的方式為對象分配了存儲空間。由於Java中一切皆為對象,所以那種特殊情況主要發生在使用“本地方法”的情況下,本地方法是一種在Java中調用非Java代碼的方式。
b. 不要過多地使用finalize(),它不是進行普通的清理工作的合適場所。
Joshua Bloch在題為“避免使用終結函數”一節中走得更遠,他提到:“終結無法預料,常常是危險的,總之是多餘的。”《Effective Java》,第20頁,(Addison-Wesley 2001)
5.5 成員初始化
Java盡力保證:所有變量在使用前都能得到恰當的初始化。
a. 對於方法的局部變量,如果使用前沒有初始化,Java以編譯時錯誤(注意,如果方法內的局部變量未被使用,將不會編譯錯誤)的形式來貫徹這種保證。
b. 對於類的成員變量:
成員變量是基本類型,Java會自動初始化初值0;
成員變量是引用類型,Java會自動初始化初值null;
初始化賦值的三種方法:
a. 對象引用賦值:ClassDemo a =b ;
b. 創建對象賦值:ClassDemo a = new ClassDemo() ;
c. 方法賦值:ClassDemo a = getClassDemoInstance() ;
5.6 構造器初始化
5.6.1 初始化執行順序:
step1: static成員變量(類成員變量)和 static {}代碼塊:按照代碼前後物理順序;
step2: 實例成員變量和非static{}代碼塊:按照代碼前後物理順序;
step3: 構造器方法
stpe4: 對象方法(Instance method)被執行
5.7 數組初始化
可以將Java中的數組作為一種數組類型來理解。
如 int[] a; 可以認為是 a 是一個數組引用,初始值為null
初始化:
int[] a = new int[3]; 初始化各元素值為0,對於boolean,初始值為false;
int[] a = {1, 2, 3}; 初始化元素分別為1, 2, 3;
5.8 枚舉類型
一種數據類型,本質同Class類型(當由javac編譯&轉換為*.class二進制流文件時)。
eg: Spiciness spiciness = Spiciness.Medium;
閱讀更多 編程家園 的文章