最终字段的初始化顺序
2022-09-03 13:28:28
请考虑以下两个类:
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。
我的问题是:在最终字段的情况下,初始化顺序是什么,JLS中描述的这种行为在哪里?
我本以为会在这里找到一些关于最终字段的特殊规则,但除非我错过了什么,否则就没有。
请注意,我知道我永远不应该从构造函数调用可重写的方法。这不是问题的重点。