2013-04-06 7 views
7

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

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

答えて

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を初期化する必要はありません。メソッドが実行されるとき。

これを防ぐには、変数イニシャライザで定数式で初期化しないようにするだけです。たとえば、次のFoo.BARは限りコンパイラが懸念している定数としてカウントされませせるのに十分だろう

class Foo { 
    public static final int BAR; 

    static { 
     BAR = 5; 
    } 
} 

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

関連する問題