我想知道,有什麼不同,在初始化靜態最終變量的各種方法?初始化靜態最終變量
private static final int i = 100;
或
private static final int i;
static {
i = 100;
}
有兩個之間有什麼不同?
我想知道,有什麼不同,在初始化靜態最終變量的各種方法?初始化靜態最終變量
private static final int i = 100;
或
private static final int i;
static {
i = 100;
}
有兩個之間有什麼不同?
如果你只設置變量,這兩種形式是等價的(你應該使用前者,因爲它是更具可讀性和簡潔)。
如果您還需要執行變量賦值以外的語句,則存在static {}
格式。 (有點做作)例如:
private static final int i;
static {
establishDatabaseConnection();
i = readIntFromDatabase;
closeDatabaseConnection();
}
是的,通過使用第二種方法,您可以使用try ... catch塊並對異常做出反應,因爲第一種方式聲明的異常無法捕捉。
在init類中執行字段和執行靜態塊時也有區別,但我沒有詳細信息,請參閱有關類實例化的語言規範以獲取更多信息。
格爾茨, GHAD
對於原始變量,什麼都沒有。不同之處在於,如果初始化不是微不足道的,或者init方法/構造函數拋出一個檢查異常 - 那麼您需要一個static
塊才能處理異常。
靜態塊的主要原因是能夠添加一些邏輯到初始化,你不能在1行初始化,如初始化一個數組或類似的東西。
它們是相同的,除了你可以在靜態代碼塊中寫入多行。
查看java的official turorial。
你也可以使用正向參考初始化
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'
這太棒了。 但是,我將「j = 2」改爲「j = j()」,並添加了「static int j(){return 2;}」。通過這些更改,ForwardReference打印「0」。所以似乎對前向參考有一些限制。 – emory 2010-07-03 21:51:46