**Java代码-MySuper类是父类,并由MySub类扩展。我正在创建对象MySub mySub = new MySub()。我以为输出将是“y”,但是当我尝试运行代码显示 null 作为输出 **
class MySuper {
String strl = "x";
public MySuper() {
myMethod();
}
void myMethod() {
System.out.print(strl);
}
}
class MySub extends MySuper {
String str2 = "y";
void myMethod() {
System.out.print(str2);
}
public static void main(String[] args) {
MySub mySub = new MySub();
}
}
最佳答案
MySub
使用的隐式构造函数如下所示:
class MySub extends MySuper {
String str2;
MySub() {
super();
str2 = "y";
}
// rest omitted for brevity
}
虽然内联字段初始化在技术上已移至构造函数中,但了解其本身并不一定重要。重要的部分是在子类的字段初始化之前调用 super 构造函数。因此,当 super 构造函数调用被子类重写的 myMethod()
方法时,str2
字段尚未被分配非默认值。这会导致您的代码打印出 null
。
这就是为什么您应该避免在构造函数中调用可重写方法的原因。
关于java - 这段代码的输出是什么以及如何输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72327619/