7

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

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

2 に答える 2

11

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

  • 文字列またはプリミティブ変数のいずれかである必要があります(おそらくnull値を持つ他のクラス;確認する必要があります)
  • 初期化式は定数式でなければなりません

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

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コンパイラに関する限り、それは定数としてカウントされないようにするのに十分です。

于 2013-04-06T21:44:57.997 に答える