簡體   English   中英

初始化最終字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM