java - 从构造函数调用方法

标签 java class constructor

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

最佳答案

Is this expected Java behavior?

是的。

What could cause this?

您在非最终父类(super class)构造函数中调用非最终覆盖方法。

让我们一步一步来看看会发生什么:

  • 您创建一个 B 的实例。
  • B()调用父类(super class)构造函数-A(),初始化父类(super class)成员。
  • A() 现在调用在 B 类中被覆盖的非 final方法,作为初始化的一部分。
  • 由于上下文中的实例属于B类,所以调用的方法load()属于B类。
  • load() 初始化 B 类实例字段 - testString
  • 父类(super class)构造器完成工作并返回(假设构造器链接到Object类已经完成)
  • B() 构造函数开始进一步执行,初始化它自己的成员。
  • 现在,作为初始化过程的一部分,B 会覆盖 testString 中先前写入的值,并将其重新初始化为 null

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

关于java - 从构造函数调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18138397/

相关文章:

java - 转换为 JAR 文件时未找到 UCanAccess 驱动程序

java - 从另一个类读取 System.out.println(Text)

c++ - 如何强制执行析构函数的调用顺序

Javascript,添加构造函数的类

Javascript 类构造函数不工作

java - 使用私有(private)构造函数扩展类

java - 默认构造函数与内联字段初始化

java - 在java中将字符串转换为stringBuilder

java - 击键不能捕捉到左/右但能够捕捉到上/下和所有其他键

c++ - 局部变量与类变量编译器优化;有效与无效