首先之前,這個問題具有着與這些漂亮的問題:通過getter訪問最後一個字段的初始化
1)Use of uninitialized final field - with/without 'this.' qualifier
2)Why isn't a qualified static final variable allowed in a static initialization block?
但我會問它另一個角度來看。只是要記住:上述提到的問題被詢問關於使用關鍵字this
在Java 7
中訪問final
字段。
在我的問題中有類似的東西,但不一樣。那麼,考慮下面的代碼:
public class TestInit {
final int a;
{
// System.out.println(a); -- compile error
System.out.println(getA());
// a = a; -- compile error
a = getA();
System.out.println(getA());
}
private int getA() {
return a;
}
public static void main(String[] args) {
new TestInit();
}
}
和輸出是:
0
0
正如你可以看到這裏有兩個不清楚的事情:
- 沒有訪問非另一種合法的方式初始化的
final
字段:使用它的getter。 - 我們應該考慮的是空白決賽場上,它的分配新建分配FY
a = getA();
爲法律將始終分配給它的默認值一樣,根據JLS
非final
場?換句話說,它是否應該被視爲預期的行爲?
您鏈接的問題具有JLS規定的規則。他們沒有說任何關於調用方法的東西,所以這些都是允許的。 – 2014-08-29 18:46:32