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

2022-09-02 10:39:46

我得到了一个非常奇怪的编译时错误:

class Super {
    Super(int[] array) {

    }
}

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

    Sub() {
        super(new int[] { number }); //error
    }
}

我得到的错误是

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

我的问题

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

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


答案 1

您的字段应该是静态的,以便您可以在构造函数调用中使用它。否则,您将获得,因为在调用父类的构造函数之前,该字段不可访问。numbercannot 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
    }
}

答案 2

来自 JLS 8.8.7

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

在调用时,实例尚不存在superSub


推荐