将值传递给超级构造函数时,无法从静态上下文访问字段

Vin*_*igh 20 java inheritance static

我有一个非常奇怪的编译时错误:

class Super {
    Super(int[] array) {

    }
}

class Sub extends Super {
    private final int number = 1;

    Sub() {
        super(new int[] { number }); //error
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

无法从静态上下文访问字段

我的问题

静态上下文在哪里?似乎静态甚至不会在这里发挥作用.

我偶然发现了这个试图回答别人的问题; 发现我感到困惑的错误.有人可以解释静态上下文的位置吗?

Mar*_*mro 6

您的字段number应该是静态的,以便您可以在构造函数调用中使用它.否则你会得到cannot reference number before supertype constructor has been called因为在调用父类的构造函数之前该字段是不可访问的.

所以你的代码应该是这样的:

class Super {
    Super(int[] array) {

    }
}

class Sub extends Super {
    private static final int number = 1;
    Sub() {
        super(new int[] { number }); //error
    }
}
Run Code Online (Sandbox Code Playgroud)


Rei*_*eus 5

来自 JLS 8.8.7

构造函数体中的显式构造函数调用语句可能不引用此类或任何超类中声明的任何实例变量或实例方法或内部类,或者使用thissuper在任何表达式中; 否则,发生编译时错误.

super通话时,一个实例Sub将不存在