1. ホーム
  2. java

[解決済み] コンストラクタでの静的ファイナルフィールドの初期化

2023-04-19 13:22:55

質問

public class A 
{    
    private static final int x;

    public A() 
    {
        x = 5;
    }
}

  • final は、変数が一度だけ(コンストラクタ内で)割り当てられることを意味します。
  • static は、クラスのインスタンスであることを意味します。

なぜこれが禁止されているのかがわかりません。これらのキーワードはどこで干渉しあっているのでしょうか?

どのように解決するのですか?

コンストラクタは、クラスのインスタンスが生成されるたびに呼び出されます。したがって、上記のコードは、インスタンスが生成されるたびにxの値が再初期化されることを意味します。しかし、この変数はfinal(静的)と宣言されているため、次のようにするしかありません。

class A {    
    private static final int x;

    static {
        x = 5;
    }
}

しかし、staticを削除すると、このように許可されます。

class A {    
    private final int x;

    public A() {
        x = 5;
    }
}

or これ。

class A {    
    private final int x;

    {
        x = 5;
    }
}