從Oracle的guide,初始化場(重點煤礦):爲什麼我不能在實例初始化塊中使用final字段?
Java編譯器副本初始化語句塊到每一個構造函數。因此,這種方法可以用來在多個構造函數之間共享一段代碼。
此外,從司法部的article關於Java實例初始化(重點煤礦):
實例的初始化塊代碼中調用超()在構造之後運行,換句話說,後所有超級構造函數都運行了。
考慮到這一點,爲什麼每次我嘗試在下面的實例初始化塊中使用(分配的)最終字段時,編譯器都會發出警告?
final class PpTitleBook implements TitleBook {
private final Resources resources;
private final Log log;
PpTitleBook(Resources resources, Log log) {
this.resources = resources;
this.log = log;
}
{
String[] resTitles = resources.getStringArray(R.array.titles);
if (book().getAllKeys().isEmpty()) {
for (int i = 0; i < resTitles.length; i++) {
newTitle(resTitles[i]);
}
}
}
我沒有其他的構造函數旁邊的上面顯示。那麼警告背後的真正原因是什麼?
答案在於以下問題:*實例初始化塊代碼在構造函數中調用super()之後運行*因此,在構造函數的其餘代碼初始化最終字段之前執行。而這正是警告信息所說的。 –
另請參見http://stackoverflow.com/questions/20593606/how-non-static-initializer-block-invoked?rq=1(問題是壞的,但答案是好的) –