物件導向過程中,初始化是Java中必不可少的一個環節,用來確保每個類的實體物件都能夠分配到儲存空間而不會造成不必要的null 指標異常。
Java 構造器
Java中,初始化對象的函數稱為構造器,每個類都會有一個不帶任何參數的預設構造器。若類中沒有聲明其他帶參數的構造器,則編譯器會自動產生一個“隱藏”的預設構造器。
注意幾點: 構造器沒有任何傳回型別(與void不同) 構造器本身是靜態方法 構造器可以通過方法重載實現不同的行為。 如果已經定義了一個構造器,則編譯器不會協助你產生預設構造器
方法重載:
區分方法重載的唯一標識:每一個重載的方法都必須要有一個獨一無二的參數列表。
注意:
傳回型別不能完全識別重載的方法,因為使用者調用不同傳回型別的方法時,可能不會注意該方法的傳回值。因此,傳回型別的不同不足以區分重載的方法。
this關鍵字
this關鍵字表示對當前對象的引用。
假設情境:在一個類的成員方法中,需要在該方法的內部獲得當前對象的引用,此時,就需要this關鍵字。且**this關鍵字只能在方法內部使用,表示調用方法的那個對象** 注意: 如果在該方法裡調用該類的其他方法,則不需要特地使用關鍵字this,只有在該方法中調用類的成員變數時,才有必要使用this。 **不要把this放在一些沒必要的地方,因為別人寫的代碼不會到處使用this,同時這也遵循一種簡潔直觀的編程風格**
構造器中調用構造器:
假設情境:當一個類中,存在多個重載的構造器,可能需要在某一個構造器中,調用另一個構造器時,可以利用this關鍵字來減少代碼的重複率。
public Class Flower{ public String s; public Flower(int num){ //do something } public Flower(String s, int num){ this(num); this.s = s; }}
上述代碼錶明,構造器Flower儘管可以用this關鍵字,調用一個構造器,但是,卻不能調用兩個,只能通過this.s = s的方式初始化。 另外,**在構造器中調用其他構造器時,必須將this關鍵字放在最起始處,**否則將不通過編譯。
清理:終結處理與記憶體回收(概要,具體會在JVM中詳細介紹)
Java有記憶體回收機制,負責回收無用對象佔據的記憶體資源,但也有特殊情況,假定某一對象(並非使用new)獲得了一塊“特殊”的記憶體地區,而記憶體回收行程卻只負責回收通過new分配的記憶體資源,這樣就會出現遺漏的情況。 因此,在Java的Object類中,定義了一個finalize()方法。 他的工作原理: 一旦記憶體回收期準備好釋放對象佔用的儲存空間,首先將調用其finalize()方法,並且在下一次記憶體回收動作發生之時,才會真正回收對象佔用的記憶體。 注意: finalize()不等於C++中的解構函式,因為解構函式一經調用,對象必然被銷毀,而Java裡的對象卻總非被記憶體回收。 換句話說: - 1 對象可能不被記憶體回收。 - 2 記憶體回收不等於析構。 - 3 記憶體回收只與記憶體有關。
成員初始化
Java儘力保證,所有變數在**使用前都能得到恰當的初始化**。對於方法內的局部變數,Java以編譯時間錯誤的形式來貫徹這種保證。
指定初始化
在定義類成員變數的地方,可以直接對其進行賦初值。
構造器初始化
可以用構造器進行初始化。在運行時刻,可以調用方法或執行某些動作來確定初值,並為編織帶來更大的靈活性。但無法阻止自動初始化的進行。 以下代碼中,因為類中只聲明了一個int類型的變數i,i在使用前會自動賦初值0,然後在構造器中變為7。
public class Counter{ int i; Counter(){ i = 7 ; }}
- 初始化順序: 在類的內部,變數定義的先後順序決定了初始化順序,即使變數定義散佈於方法定義之間,也會先於方法被調用之前進行初始化。 - (static)待用資料初始化 注意 - 1 待用資料只佔一份儲存地區,為所有對象所共用 - 2 static關鍵字不能應用於局部變數,因為局部變數儲存於棧中,隨方法調用的結束而銷毀。 - 3 若一個域是靜態基本類型域,則無初始化的情況下,也會獲得基本類型的標準初值。,若為一個對象引用,則預設初始化值為null。 - 4 **靜態初始化只有在必要時刻才會進行** 比如調用類的靜態方法、建立類對象(如前文所述,構造器也是靜態方法,只是沒有顯示聲明static關鍵字。),或者第一次訪問待用資料時,靜態初始化才會進行。 - 顯示的靜態初始化 Java允許將多個靜態初始化動作組織成一個特殊的靜態子句(或者“靜態塊”)。該子句初始化順序與其他靜態初始化動作一樣,僅執行一次。
public class Spoon{ static int i; static{ i = 47; }}
- 非顯示的靜態初始化 即沒有static關鍵字的的子句,用來初始化類的非靜態變數。
注意:無論是哪個子句,他都優先於構造器初始化之前執行。
執行順序為:靜態子句—>非靜態子句–>構造器 數組的初始化
聲明數組時,編譯器不允許指定其大小,只能夠通過“{}”的形式對其進行初始化,