簡體   English   中英

如何用final實現static?

[英]How to implement static with final?

我對finalstatic關鍵字的含義感到困惑。 據我所知,這是因為static在類中創建了單獨的內存。 只能通過static方法訪問static字段。 然后,為什么在Test構造函數中聲明list時沒有錯誤?

第一個問題

public Test() {
    list = new ArrayList();
    list.add("foo");
}

當我宣布

public class Test {
    private static List list;

    public Test() {
        list = new ArrayList();
        list.add("foo");    
    }

    public static void main(String [] args) throws IOException{
        list = new ArrayList();

        Test t = new Test();
        t.list.add("add");

        System.out.print("Hello " + t.list);    
    }
}

工作正常。 但是當我用static添加final時,它不起作用。

第二個問題:

public class Test {
    private static final List list;

    public Test() {
        list = new ArrayList();
        list.add("foo");
    }

    public static void main(String [] args) throws IOException{
        list = new ArrayList();

        Test t = new Test();
        t.list.add("add");

        System.out.print("Hello" + t.list); 
    }
}

請說明其內部運作方式。

問題1

在對象上使用static關鍵字可以在容器類的所有對象之間共享一個相同的副本。 因此,如果初始化,請重新分配該靜態對象,該類的所有對象的確會更改。 您可以使用該靜態引用創建新對象,也可以根據需要對其進行多次分配,但是它將反映到容器類的所有現有對象和新對象中。 您不能為特定的容器類對象分配不同的值。 使用類名后跟變量名,甚至可以在實例化容器類之前,隨時隨地訪問靜態變量。 關於訪問靜態變量,您可以從任何靜態或非靜態方法訪問它。 但是在靜態方法中,您只能使用靜態變量或僅在該方法中聲明的變量。

問題2

對對象使用final關鍵字告訴編譯器應該只有一個,並且應該將單個對象/值與聲明為final的引用關聯。 最終對象/變量僅應在聲明時初始化一次。 其值/引用對象無法進一步更改/重新分配。 這就是我們在C ++中所謂的常量變量。

希望能幫助到你。

干杯..!!

檢查以下代碼和隨附的注釋。

public class Test {

// this can be set only once and only from the static block
private static final List listStaticFinal;

// this is initialized when declared
private static final List listStaticFinalInitialized = new ArrayList();

// this can be set many times from multiple places
private static List listStatic;

// this is initialized when declared
private static List listStaticInitialized = new ArrayList();

static {
    // can set only once from here
    listStaticFinal = new ArrayList();

    // can be set also from here
    listStatic = new ArrayList();
}

public Test() {
    // can be set also from here
    listStatic = new ArrayList();
}

public static void main(String[] args) {
    // can be set also from here
    listStatic = new ArrayList();
}

}

注意 :您只能在靜態塊中設置靜態最終字段。

注意 :Java沒有靜態類的概念。 如果您希望類的行為類似於靜態類,則可以將構造函數標記為私有。

注意 :在編寫靜態字段時,還請考慮將在其中使用代碼的上下文並適當地記錄代碼。 例如,您的代碼可能在多線程方案中使用。

注意 :在編寫靜態字段時,還要考慮如何測試您的代碼。 靜態可能會給模擬相應的代碼帶來困難。

由於最終變量只能在啟動期間初始化一次,因此允許構造函數初始化變量。 在這里,我們還得到了靜態信息 ,這意味着您必須在類加載期間初始化變量。 可以使用靜態初始化程序塊來完成。

靜態{list = new ArrayList(); }

對於第一個問題, static關鍵字表示即使您不實例化該類,該變量也將可用。 例如,在您的示例中,即使您從不調用new yourClass()yourClass.list引用列表。 如果您沒有使用static關鍵字, 在實例化該類之前, yourClass.list 尚不存在

final關鍵字用於聲明常量 也就是說,在變量初始化后(首次為其分配了一個值),無論是在構造函數中

public Test(){
    list = new ArrayList();
}

或在聲明之后立即private final List list = new ArrayList(); ,這是一成不變的 任何嘗試更改它的嘗試(例如,使用另一個list = …語句)都會導致錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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