Java 构造函数的调用方法

对不起任何较小的语法错误或其他错误,我正在使用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()
  • 初始化变量(根据调试器调用“私有字符串testString = null”),将其无效。

这是预期的Java行为吗?是什么原因造成的?它是在1.7 JDK上运行的Java 1.6应用程序。

回答:

这是预期的Java行为吗?

是。

是什么原因造成的?

你在非最终超类构造函数中调用非最终覆盖方法。

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

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

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

以上是 Java 构造函数的调用方法 的全部内容, 来源链接: utcz.com/qa/416904.html

回到顶部