2013-04-06 49 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

有時它會 - 這取決於變量是否實際上是一個恆定

  • 它必須是一個字符串或一個原始變量(可能任何其他類與空值;我必須檢查)
  • 初始化表達式必須是一個常量表達式

如果是這種情況,那麼對變量的任何引用都會有效地轉化爲值。因此,在這個代碼:

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至於編譯器來說不能算作一個常數。