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