1. ホーム
  2. java

[解決済み] スーパータイプのコンストラクタが呼び出される前に "X" を参照することはできません。

2022-02-07 22:43:43

質問

次の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;
    }
}

このコードはコンパイルされず、コンパイラーは私が上で強調した行について文句を言います。なぜこのようなエラーが発生するのでしょうか。また、どのように対処すればよいのでしょうか。

解決方法は?

コードが最初にコンパイルされない理由は、以下の通りです。 defaultValue インスタンス変数 のクラス Test という型のオブジェクトがある場合、そのオブジェクトは Test の一意なインスタンスが作成されます。 defaultValue も作成され、その特定のオブジェクトに添付されます。このため、このオブジェクトを参照するために defaultValue はまだ作成されていないため、コンストラクタで使用することはできません。

解決策としては、最後の変数を static :

public class Test {

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

    public Test() {
        this(defaultValue);
    }

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

という変数にすることで static のすべてのインスタンスで共有されます。 Test . 静的変数は、JVMが最初にクラスをロードするときに作成されます。インスタンスを生成するためにクラスを使用するとき、クラスはすでにロードされているので、スタティック変数は使用する準備ができており、コンストラクタを含むクラス内で使用することができます。

リファレンスです。