原文出自 http://www.cnblogs.com/ggjucheng/archive/2012/11/30/2796666.html
正如你看到的,我們經常在字段的聲明中提供一個初始化值:
public classBedAndBreakfast {//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方法:
classWhatever {public static varType myVar =initializeClassVariable();private staticvarType initializeClassVariable() {//initialization code goes here
}
}
私有static方法的優點是,它可以在你需要重新初始化變量時被重用。
實例化實例成員
一般來說,你會把變量的初始化代碼放在構造方法里。這里有兩個可選的使用構造方法初始化實例變量的方法:初始化代碼塊和final方法。
實例變量的初始化代碼塊和static初始化代碼塊差不多,但是沒有static關鍵字:
{//whatever code is needed for initialization goes here
}
java編譯器會把初始化代碼塊拷貝到每個構造方法。所以,這種方式可以用來在多個構造方法中共享代碼塊。
一個final方法不能被子類覆蓋。這個會在接口和繼承的章節討論。這里有一個例子,使用final方法初始化實例變量:
classWhatever {private varType myVar =initializeInstanceVariable();protected finalvarType initializeInstanceVariable() {//initialization code goes here
}
}
如果子類要重用初始化代碼,這是特別有用的。初始化代碼設置為final,這個是因為在實例初始化時,調用非final方法會造成問題。