【发布时间】:2017-07-08 14:26:59
【问题描述】:
例如,
Subclass extends ParentClass {
private String subclassField;
Subclass() {
// it's illegal
super(subclassField);
}
}
这会引入编译错误“在调用构造函数时无法引用实例字段”。
对于 StackOverflow 中有关此场景的类似问题的一些答案,请转到“因为当前实例仍在构建中”或“尚未在堆中创建的实例”。
然而,令人困惑的是, 在超类构造函数中,可以调用可覆盖的成员方法,这些方法可以访问子类当前实例的字段。在 Java 中也可以。
我的查询是
在实例构造过程中,从什么时候开始可以引用子类的字段?
“在调用构造函数时不能引用实例字段”,而在超类构造函数中调用可覆盖的方法是可以的,背后的基本原理是什么?
【问题讨论】:
-
您对#2 提出的实际 问题是什么?例如,为什么基本原理很重要?语言就是这样。
-
在 Java 中没关系:编译器接受它,但这是不好的做法。无论如何,所有字段都将具有其默认值,因此您可以只传递 null 而不是 subclassField。传递子类字段有 99.999% 的机会成为错误,因此禁用它是有意义的。调用可覆盖的方法可以很好,因为它不一定访问子类字段。
标签: java class oop inheritance