超级调用时变量为空

Den*_*hel 5 java null nullpointerexception super superclass

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

TestSuper.java

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

    protected abstract void testMethod();
}
Run Code Online (Sandbox Code Playgroud)

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

TestMain.java

public class TestMain {
    public static void main(String[] args) {
            new TestNull();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

null
Test
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况并且有一个很好的解决方法呢?

WoD*_*oSc 8

当你调用new TestNull();你正在调用类的构造函数时TestNull,它调用super()构造函数:它包含对实现的方法的调用,在TestNull那里打印String字段,此时子类的字段TestNull尚未初始化,即为空.

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

这里的关键点是在超类的实例化之后初始化子类的字段.

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