java如果基构造函数调用派生方法中重写的方法,并且方法使用samenamed(阴影)字段,会发生什么?
请验证我的理解/猜测,为什么下面的代码会抛出NPE,以及到底发生了什么:
- 在调用派生类的新派生()构造函数之后李>
- 派生构造函数立即调用基构造函数(发生隐式构造函数链接)
- 基本构造函数调用foobar()。没有不同的foobar()方法(基本版本和派生版本),所以这是“version”中的foobar(),在派生版本中被重写
- 这个单一的foobar()“version”(在Base\Derived之间共享)搜索要使用的str字段。由于foobar()在派生中被重写(“定义”),因此它需要派生的str(不能使用Base中的str)
- 此时,派生中的str不是init(因为在基本构造函数完成之前,派生构造函数无法开始工作),所以我们得到了NPE李>
另外,我知道不建议从构造函数调用非final或非私有的非静态方法。此外,对于C++中的虚拟方法,它派生的重写版本不会被调用在java中的基本构造中。p>
class Base {
String str = "abc";
Base() {
foobar();
}
void foobar() {
System.out.println(str.toUpperCase());
}
}
class Derived extends Base {
String str = "qwe";
Derived() {
foobar();
}
@Override
void foobar() {
System.out.println(str.toLowerCase());
}
}
public class My {
public static void main(String[] args) {
new Derived();
}
}
共 (0) 个答案