请原谅任何小的语法错误或诸如此类的错误,我正在通过Jitsi模块遇到这个问题并且不熟悉Java,想要确认发生了什么以及为什么以及如何修复它。 public abstract class A{ public A() { this.load(); } protected void load() { }}public class B extends A{ private String testString = null; public B() { super(); } @Override protected void load() { testString = "test"; }}应用程序在使用按名称加载类方法创建类B的实例时执行此操作:在B类中调用重写的load()初始化变量(根据调试器调用“private string testString = null”),将它们清零。这是预期的Java行为吗?什么可能导致这个?它是在1.7 JDK上运行的Java 1.6应用程序。
2 回答

桃花长相依
TA贡献1860条经验 获得超8个赞
这是预期的Java行为吗?
是。
什么可能导致这个?
您在非final超类构造函数中调用非最终重写方法。
让我们一步一步看看会发生什么:
您创建一个实例
B
。B()
调用超类构造函数 -A()
来初始化超类成员。A()
现在调用一个在B
类中重写的非final方法,作为初始化的一部分。由于上下文中的实例是
B
类,因此load()
调用的方法是B
类。load()
初始化B
类实例字段 -testString
。超类构造函数完成作业,并返回(假设构造函数的链接
Object
已经完成)该
B()
构造函数开始执行进一步,初始化它自己的成员。现在,作为启动过程的一部分,
B
覆盖先前的写入值testString
,并将其重新初始化为null
。
道德:永远不要在其构造函数中调用非最终类的非最终公共方法。
添加回答
举报
0/150
提交
取消