从构造函数调用方法

请原谅任何小的语法错误或诸如此类的错误,我正在通过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应用程序。


皈依舞
浏览 495回答 2
2回答

桃花长相依

这是预期的Java行为吗?是。什么可能导致这个?您在非final超类构造函数中调用非最终重写方法。让我们一步一步看看会发生什么:您创建一个实例B。B()调用超类构造函数 - A()来初始化超类成员。A()现在调用一个在B类中重写的非final方法,作为初始化的一部分。由于上下文中的实例是B类,因此load()调用的方法是B类。load()初始化B类实例字段 - testString。超类构造函数完成作业,并返回(假设构造函数的链接Object已经完成)该B()构造函数开始执行进一步,初始化它自己的成员。现在,作为启动过程的一部分,B覆盖先前的写入值testString,并将其重新初始化为null。道德:永远不要在其构造函数中调用非最终类的非最终公共方法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java