首先,这个问题与这些好问题有着前瞻性的关系:
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?
但我会以另一种视角来问它。只是为了记住:上面提到的问题是关于使用final
中的关键字this
访问Java 7
字段的问题。
在我的问题中,有类似的东西,但不一样。好吧,请考虑以下代码:
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。a = getA();
视为合法,并始终为其分配默认值,例如非final
字段JLS
?换句话说,它应该被视为预期行为吗? 答案 0 :(得分:0)
您真正遇到的是编译器的推理能力。 对于您的第一个编译器错误,该失败,因为编译器肯定知道a未分配。与第二个a = a相同(你不能从a分配,因为它在那个时候肯定没有分配)。 工作a = getA()的行是a的第一个,单个,明确的赋值,因此很好(无论值来自何处; getA()的实现都不重要且不是&# 39;此时评估)。
方法getA()有效且可以返回a,因为实例初始值设定项已明确为a赋值。
对于看待它的人来说这是有意义的,但它不是编译器内置的推理。每个独立评估的块都有效。