《JAVA編程思想》5分鐘速成:第5章(初始化和清理)

第五章、初始化和清理

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;


《JAVA編程思想》5分鐘速成:第5章(初始化和清理)


分享到:


相關文章: