这是预期的Java行为吗?
是。
是什么原因造成的?
你在非最终超类构造函数中调用非最终覆盖方法。
让我们一步一步地看看会发生什么:
- 你创建的实例B。
B()
调用超类构造函数-A()
,以初始化超类成员。A()
现在B作为初始化的一部分,调用一个在类中被覆盖的非最终方法。- 由于上下文中的实例是B类,因此
load()
调用的方法是B类。 load()
初始化B类实例字段-testString
。- 超类构造函数完成工作并返回(假设构造函数链接到
Object
类完成) - 该
B()
构造函数开始执行进一步,初始化它自己的成员。 - 现在,作为初始化过程的一部分,B覆盖中先前的写入值
testString
,然后将其重新初始化为null
。
道德:永远不要在构造函数中调用非最终类的非最终公共方法。



