奇怪,但我找不到这个问题的重复项。 我有一个带有 overrideMe() 方法的父类(super class)和一个覆盖它的子类。 Final字段真的在调用子类构造函数之前初始化了吗? 正如我从输出中看到的那样,确实如此。
这是输出: 父类(super class)构造 str 值:someValue 子类构造 str值:someValue
你能给我解释一下吗? 我认为实例变量是在构造函数调用内初始化的,而不是在调用之前初始化的。
代码如下:
public class Test {
public Test() {
System.out.println("Superclass constr");
overrideMe();
}
public void overrideMe() {
}
}
class Ext extends Test {
private final String str = "someValue";
public Ext() {
System.out.println("Subclass constr");
}
@Override
public void overrideMe() {
System.out.println("str value: " + str);
}
public static void main(String[] args) {
Ext test = new Ext();
test.overrideMe();
}
}
编辑: 如果我将 str 字段声明为非最终字段,则构造函数中对它的子类调用将按我的预期返回 null。
最佳答案
是的,字段在调用构造函数之前初始化,并且从重载类之前的上层类开始。
以下是一般介绍:http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ306_014.htm
关于java - 子类中的最终字段初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11079968/