標籤:程式 中文 val java 學習筆記 方法 賦值 而且 比較
第五章:初始化與清理
初始化和清理是涉及程式安全的兩個問題。Java構造器用於建立對象時的初始化,而記憶體回收行程則進行清理。
構造器的名稱必須與類名一樣,雖然構造器是一種特殊的方法,但是每個方法首字母小寫編碼風格並不適合用於構造器。
構造器是沒有傳回值的,但是new運算式卻返回了對建立對象的引用。
方法重載是構造器所必須的。每個重載方法都必須獨一無二的參數列表。甚至參數順序的不同,也足以區分兩個方法。不過一般不建議這麼做,因為這會使代碼難以維護。當傳入的資料類型小於方法中聲明的形式參數類型,實際資料類型就會被提升。但是boolean不能轉換,char也比較特殊,提升至int。如果反過來,傳入大於聲明,則必須進行強轉,否則報錯。(注意,根據傳回值的不同來區分方法是不成立的。)
各參數類型大小順序排列:boolean:1/8;byte:1;char:2(一個字元可以儲存一個中文漢字);short:2;int:4;float:4;long:8;double:8。(單位:位元組)
this關鍵字:只能在方法內部使用,表示對"調用方法的那個對象"的引用。只有在需要明確指出對當前對象的引用時,才有必要使用this。如果在方法內部使用同一個類中的另一個方法,就不用使用this。return this表示返回當前引用。
通常寫this的時候,都是指"這個對象"或者"那個對象",而且它本身表示對當前對象的引用。在構造器中,如果this添加了參數列表,那麼就有了不同的含義。這將產生對符合此參數列表的某個構造器的明確調用。通過下面的程式碼範例將會理解的更加深刻。
public class Flower {int petalCount = 0;String s = "initial value";Flower(int petals){petalCount = petals;System.out.println("Constructor w/ int arg only,petalCount=" + petalCount);}Flower(String ss){System.out.println("Constructor w/ String arg only,s=" + ss);s = ss;}Flower(String s,int petals){this(petals);
//this(s)//錯誤,不能在一個構造器裡面調用兩次構造器this.s = s;//因為成員名字和參數S的名稱一致,所有採用這種寫法加以區分。System.out.println("String & int args");}Flower(){this("hi",47);System.out.println("default constructor(no args)");}void printPetalCount(){
//this(11);//錯誤,不能在非構造器方法裡通過this調用構造器。System.out.println("petalCount =" + petalCount + " s=" + s);}public static void main(String[] args){Flower x = new Flower();x.printPetalCount();}}
output:
Constructor w/ int arg only,petalCount=47String & int argsdefault constructor(no args)petalCount =47 s=hi
關於static的補充:
static方法不能包含this,即不能調用非靜態方法。反過來倒是可以。而且在沒有建立對象的時候,單依靠對象本身就可以對static方法進行調用。這實際上是static的主要作用。這很像全域方法,Java中禁止使用全域方法,但你在類中置入static方法,就可以訪問其他的static方法和static域。
有些人認為static方法不是"物件導向"的,因為他們的確具有全域函數的含義,使用static方法時,由於並不是通過this來向對象發送資訊。的確,要是代碼中存在大量的static,就應該重新考慮自己的設計。然而static的概念有其實用之處,許多時候都要用到它,至於是不是物件導向,不是我們說了算的。
關於終結處理和記憶體回收,將在後面的博文中詳細介紹。
Java儘力保證:所有變數在使用前必須得到恰當的初始化。
對於類中基本成員(即欄位)是基本類型的,會自動為這些成員初始化。但是方法中的局部變數則不會,必須強製程序員賦予初始值,否則編譯報錯。
成員初始化的三種情況:
(1)類中基本成員變數:直接在定義的地方為其賦值。(C++中不可以)
(2)非基本類型的對象:
class Depth{}public class Measurement {Depth d = new Depth();}
(3)通過調用某個方法來提供初值,這個方法也可以帶有參數,但是這些參數必須是應景被初始化了的:
public calss MethodInit2{int i = f();int j = g(i);int f(){return 11;}int g(int n){return n * 10;}}
Thinking In Java第五章學習筆記