请原谅任何小的语法错误或诸如此类的错误,我正在通过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
提交
取消
