原文出自 http://www.cnblogs.com/ggjucheng/archive/2012/11/30/2796666.html
正如你看到的,我們經常在欄位的聲明中提供一個初始化值:
public class BedAndBreakfast { // initialize to 10 public static int capacity = 10; // initialize to false private boolean full = false;}
當初始化的值是可用的,初始化語句也放在一行,上面的代碼就可以工作。但是這種形式的初始化由於比較簡單,所以有一些限制。如果初始化需要一些邏輯處理(例如,錯誤處理或者是通過迴圈填充一個複雜的數組),簡單的賦值是不足的。執行個體變數可以在構造方法初始化,並做錯誤處理和邏輯處理。為了給類變數提供一樣的功能,java程式語言套件含了靜態初始塊。
注意:儘管在類聲明的開始時,聲明欄位是最常用的實踐,但是它非必須。只有它在使用前必須聲明和初始化才是必須的。
靜態初始塊
一個靜態初始化代碼塊,就像平常的代碼塊,使用大括弧{}閉合,前面有一個static關鍵字,這裡是例子:
static { // whatever code is needed for initialization goes here}
一個類可以有任意數量的靜態初始塊,並可以出現在類體的任意位置。運行系統保證靜態初始塊的調用順序和在原始碼的出現順序是一致的。
這裡是一個替代代碼塊的方法—可以寫一個私人的static方法:
class Whatever { public static varType myVar = initializeClassVariable(); private static varType initializeClassVariable() { // initialization code goes here }}
私人static方法的優點是,它可以在你需要重新初始設定變數時被重用。
執行個體化執行個體成員
一般來說,你會把變數的初始化代碼放在構造方法裡。這裡有兩個可選的使用構造方法初始化執行個體變數的方法:初始化代碼塊和final方法。
執行個體變數的初始化代碼塊和static初始化代碼塊差不多,但是沒有static關鍵字:
{ // whatever code is needed for initialization goes here}
java編譯器會把初始化代碼塊拷貝到每個構造方法。所以,這種方式可以用來在多個構造方法中共用代碼塊。
一個final方法不能被子類覆蓋。這個會在介面和繼承的章節討論。這裡有一個例子,使用final方法初始化執行個體變數:
class Whatever { private varType myVar = initializeInstanceVariable(); protected final varType initializeInstanceVariable() { // initialization code goes here }}
如果子類要重用初始化代碼,這是特別有用的。初始化代碼設定為final,這個是因為在執行個體初始化時,調用非final方法會造成問題。