为了账号安全,请及时绑定邮箱和手机立即绑定

从构造函数调用方法

从构造函数调用方法

皈依舞 2019-09-02 17:19:23
请原谅任何小的语法错误或诸如此类的错误,我正在通过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

道德:永远不要在其构造函数中调用非最终类的非最终公共方法。


查看完整回答
反对 回复 2019-09-02
  • 2 回答
  • 0 关注
  • 494 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号