1. ホーム
  2. java

[解決済み] Java の静的ブロックが実行されない

2023-04-27 01:26:56

質問

class Test {
    public static void main(String arg[]) {    
        System.out.println("**MAIN METHOD");
        System.out.println(Mno.VAL); // SOP(9090);
        System.out.println(Mno.VAL + 100); // SOP(9190);
    }

}

class Mno {
    final static int VAL = 9090;
    static {
        System.out.println("**STATIC BLOCK OF Mno\t: " + VAL);
    }
}

は知っているのですが static ブロックはクラスがロードされたときに実行されることは知っています。しかし、この場合、クラス内のインスタンス変数 Mnofinal であるため、その分 static ブロックは実行されません。

なぜそうなるのでしょうか?また、もし私が final を削除すれば、うまくいくのでしょうか?

どちらのメモリが先に確保されるかというと static final 変数と static ブロックのどちらを使用しますか?

もし final アクセス修飾子によってクラスがロードされない場合、どのようにして変数がメモリを取得できるのでしょうか?

どのように解決するには?

  1. A static final int フィールドは コンパイル時定数 であり、その値はその起源を参照することなく、宛先クラスにハードコードされます。
  2. したがって、メインクラスはフィールドを含むクラスのロードをトリガーしません。
  3. 従って、そのクラス内の静的イニシャライザーは実行されません。

具体的には、コンパイルされたバイトコードがこれに相当します。

public static void main(String arg[]){    
    System.out.println("**MAIN METHOD");
    System.out.println(9090)
    System.out.println(9190)
}

を削除すると同時に final を削除した時点で、それはもはやコンパイル時の定数ではなく、 上で説明した特別な動作は適用されません。また Mno クラスは期待通りにロードされ、その静的イニシャライザが実行されます。