在调用超类型构造函数之前无法引用“X”,其中 x 是最终变量

2022-08-31 12:08:39

请考虑以下 Java 类声明:

public class Test {

    private final int defaultValue = 10;
    private int var;

    public Test() {
        this(defaultValue);    // <-- Compiler error: cannot reference defaultValue before supertype constructor has been called.
    }

    public Test(int i) {
        var = i;
    }
}

代码将无法编译,编译器抱怨我上面突出显示的行。为什么会发生此错误,最好的解决方法是什么?


答案 1

代码最初不会编译的原因是 因为它是类的实例变量 ,这意味着当创建类型对象时,也会创建唯一的实例并将其附加到该特定对象。因此,无法在构造函数中引用,因为尚未创建构造函数和对象。defaultValueTestTestdefaultValuedefaultValue

解决方案是使最后一个变量:static

public class Test {

    private static final int defaultValue = 10;
    private int var;

    public Test() {
        this(defaultValue);
    }

    public Test(int i) {
        var = i;
    }
}

通过使变量 ,它与类本身相关联,而不是该类的实例,并在 的所有实例之间共享。静态变量是在 JVM 首次装入类时创建的。由于在使用类创建实例时已加载该类,因此静态变量已准备就绪,因此可以在类(包括构造函数)中使用。staticTest

引用:


答案 2

这是因为 是 正在构建(尚未创建)的 实例的成员defaultValueTest

如果你有它,它是在类加载器加载你的类时加载的static