【发布时间】:2015-03-12 13:20:07
【问题描述】:
考虑这两个类:
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 的特殊规则,但除非我错过了什么,否则没有。
请注意,我知道我永远不应该从构造函数中调用可覆盖的方法。这不是问题的重点。
【问题讨论】:
标签: java constructor final jls