問題

クラス名を持つ最終的な静的変数にアクセスしている間、なぜ静的ブロックがJavaで処理されていないのですか?

 class Foo {
  public static final int BAR;
  static {
    System.out.println("Hello");
    }
  }
class Baz {
  public static void quux() {
    System.out.println(Foo.BAR);
  }
}
 

  ベストアンサー

変数が実際に定数であるかどうかによって異なります。

  • それは文字列またはプリミティブ変数(おそらくヌル値を持つ他のクラス。私はチェックする必要があります)
  • 初期化式は定数式でなければなりません

その場合、変数への参照は効果的に値に変換されます。したがって、このコードでは:

 class Foo {
    public static final int BAR = 5;
}

class Baz {
    public static void quux() {
        System.out.println(Foo.BAR);
    }
}
 

Bazのメソッドは、次のようなコードにコンパイルされます。

 public static void quux() {
    System.out.println(5);
}
 

バイトコードにFoo.BARのヒントが残っていないため、メソッドの実行時にFooを初期化する必要はありません。

それが起こらないようにしたい場合は、常に変数初期化子の定数式で初期化されないようにします。例えば:

 class Foo {
    public static final int BAR;

    static {
        BAR = 5;
    }
}

class Baz {
    public static void quux() {
        System.out.println(Foo.BAR);
    }
}
 

コンパイラに関する限り、Foo.BARを定数としてカウントしないようにするだけで十分です。

  同じタグがついた質問を見る

java