2010-07-02 182 views
3

我想知道,有什麼不同,在初始化靜態最終變量的各種方法?初始化靜態最終變量

private static final int i = 100; 

private static final int i; 
static { 
    i = 100; 
} 

有兩個之間有什麼不同?

回答

11

如果你只設置變量,這兩種形式是等價的(你應該使用前者,因爲它是更具可讀性和簡潔)。

如果您還需要執行變量賦值以外的語句,則存在static {}格式。 (有點做作)例如:

private static final int i; 
static { 
    establishDatabaseConnection(); 
    i = readIntFromDatabase; 
    closeDatabaseConnection(); 
} 
1

是的,通過使用第二種方法,您可以使用try ... catch塊並對異常做出反應,因爲第一種方式聲明的異常無法捕捉。

在init類中執行字段和執行靜態塊時也有區別,但我沒有詳細信息,請參閱有關類實例化的語言規範以獲取更多信息。

格爾茨, GHAD

1

對於原始變量,什麼都沒有。不同之處在於,如果初始化不是微不足道的,或者init方法/構造函數拋出一個檢查異常 - 那麼您需要一個static塊才能處理異常。

2

靜態塊的主要原因是能夠添加一些邏輯到初始化,你不能在1行初始化,如初始化一個數組或類似的東西。

1

它們是相同的,除了你可以在靜態代碼塊中寫入多行。

查看java的official turorial

1

你也可以使用正向參考初始化

public class ForwardReference { 
private static final int i = getValue(); 
private static final int j = 2; 
public static void main(String[] args) { 
    System.out.println(i); 
} 

private static int getValue() { 
    return j*2; 
} 

}

這裏的關鍵是,我們得到了前「J」從「的getValue」 J'的價值已被宣佈。靜態變量按其出現的順序進行初始化。

這將打印正確的值'4'

+0

這太棒了。 但是,我將「j = 2」改爲「j = j()」,並添加了「static int j(){return 2;}」。通過這些更改,ForwardReference打印「0」。所以似乎對前向參考有一些限制。 – emory 2010-07-03 21:51:46