考虑以下两类:
public abstract class Bar {
protected Bar() {
System.out.println(getValue());
}
protected abstract int getValue();
}
public class Foo extends Bar {
private final int i = 20;
public Foo() {
}
@Override
protected int getValue() {
return i;
}
public static void main(String[] args) {
new Foo();
}
}
如果我执行Foo,输出为20。
如果我使该字段为非最终字段,或者在Foo构造函数中对其进行初始化,则输出为0。
我的问题是:在使用final字段的情况下,初始化顺序是什么?在JLS中此行为在哪里描述?
我期望找到有关final字段here的一些特殊规则,但是除非我错过了一些东西,否则不会这样。
请注意,我知道我绝不应该从构造函数中调用可重写的方法。这不是问题的重点。
最佳答案
您的final int i
成员变量是一个常量变量:4.12.4. final
Variables
如12.4.2. Detailed Initialization Procedure中所述,这会对事物初始化的顺序产生影响。