考虑以下两类:

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中所述,这会对事物初始化的顺序产生影响。

10-07 19:33
查看更多