[英]initializing a final field
這個Q寧可用於驗證:
靜態的final字段可以在聲明時進行初始化:
public static final int i=87;
或在靜態塊中:
public static final int i;
//..........
static {
...
i=87;
...
}
除了靜態塊之外,還有其他地方嗎?
public static final int i;
可以初始化嗎?
提前致謝。
注意:請參見在構造函數中初始化靜態final字段 。 並不確定在聲明之外,靜態塊是唯一對其進行初始化的地方。
// ==============
加:
擴展@noone的好答案,以回應下面的@Saposhiente:
在某些非靜態上下文中混合:
public class FinalTest {
private static final int INT = new FinalTest().test();
private int test() {
return 5;
}
}
Java語言規范規定
如果聲明該類的靜態初始值設定項(§8.7)未明確分配空白的final(§4.12.4)類變量(第16.8節),則是編譯時錯誤。
所以答案
除了靜態塊之外,還有其他地方可以初始化靜態final字段嗎?
不,沒有。
號這是一個場static
屬於類,和一個領域,是final
必須由它變成可見的時間分配,所以static final
字段必須要么聲明或靜態初始化(兩者都被編譯初始化到同一件事),以便在類加載完成時具有一個值。
可以在任何隨機靜態方法中對其進行“初始化”,但只能通過使用static
塊或變量初始化來間接進行“初始化”。
public class FinalTest {
private static final int INT = test();
private static int test() {
return 5;
}
}
或像這樣:
public class FinalTest {
private static final int INT;
static {
INT = test();
}
private static int test() {
return 5;
}
}
從技術上講,它實際上不是test()
的初始化,但它的行為就像一個初始化。
它只能在始終只運行一次的一組靜態代碼中進行初始化。 這通常在其聲明中或在靜態塊中,但您也可以做一些奇怪的事情
static final int i;
static int j = i = 1;
從技術上講,這都不是。 無論哪種方式,您都無法在任何類型的函數或構造函數中對其進行初始化,因為該函數可能會運行多次; 您必須使用靜態聲明或代碼塊來運行該函數,並使用返回值對其進行初始化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.