gpt4 book ai didi

java - super 调用时变量为空

转载 作者:搜寻专家 更新时间:2023-10-31 19:28:04 26 4
gpt4 key购买 nike

我正在使用 Java 7 并获得了 3 个类:

TestSuper.java

public abstract class TestSuper {
public TestSuper() {
testMethod();
}

protected abstract void testMethod();
}

TestNull.java

public class TestNull extends TestSuper {
private String test = "Test";

public TestNull() {
super();
System.out.println(test);
}

@Override
protected void testMethod() {
System.out.println(test);
}

}

TestMain.java

public class TestMain {
public static void main(String[] args) {
new TestNull();
}
}

输出:

null
Test

为什么会发生这种情况,是否有好的解决方法?

最佳答案

当您调用 new TestNull(); 时,您正在调用类 TestNull 的构造函数,它调用 super() constructor: 包含对TestNull中实现的方法的调用,打印String字段,此时子类TestNull的字段还没有初始化,即为空。

在 super 构造函数调用之后,所有字段都将被初始化,因此第二个打印实际上显示了(初始化的)字符串的新值。

这里的关键点是子类的字段父类(super class)的实例化之后被初始化。

解决方法?这取决于您想要的确切行为:也许不在 super 构造函数中调用抽象方法(即在 TestSuper 类的构造函数中)是有意义的。

关于java - super 调用时变量为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24327834/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com