簡體   English   中英

在java中初始化靜態變量

[英]Initializing static variables in java

究竟是什么意思“靜態變量在加載類時被初始化”? 我在網上閱讀了很多討論,但我仍感到困惑。 第2步是初始化步驟,對吧? 然后在第1步“加載類時”會發生什么?

 public class NewClass {
    static int[] arr; //Step 1
    NewClass(){
        arr = new int[10]; //Step 2
        for(int i= 0;i<10;i++){
            arr[i] = i;
        }
    }
}

如果要在加載類時初始化它,則應使用static初始化程序:

public class NewClass {
    static int[] arr; //Step 1

    static {
        arr = new int[10]; //Step 2
        for(int i= 0;i<10;i++){
            arr[i] = i;
        }
    }
}

在構造函數中初始化靜態成員會破壞靜態成員的用途,因為它們不屬於任何實例,並且您將創建的每個新實例都將覆蓋靜態數組的值。

您應該在聲明靜態變量時或在靜態初始化塊中初始化靜態變量。

static int[] arr = new int[10];

要么

static {
    arr = new int[10];
}

加載類時將發生初始化(即執行靜態聲明和靜態初始化塊),這在您的應用程序首次訪問類的任何成員(構造函數,靜態方法,靜態變量)時發生。

第2步是初始化步驟,對吧?

不,它被稱為數組的構造。 數組的初始化意味着在第2步之后將數據放入其中。

然后在第1步“加載類時”會發生什么?

加載類時,所有靜態變量都使用其默認值進行初始化。 對於Object它的默認值為null或者您可以說一個指向任何內容的引用。 此時沒有為陣列分配內存。

在第2步之前會發生什么?

當使用關鍵字new創建NewClass類型的對象時,將調用構造函數並構造數組並為堆中的10個int值分配內存,並將所有零作為默認值(直到步驟2)

第2步后會發生什么?

在第2步之后,您實際上正在初始化數組,即將值放入其中。


static int[] arr;   // declaration

arr = new int[10];  // construction

arr[i] = i;         // initialization

如果您想了解更多信息,請閱讀SCJP Sun認證程序員Java 6

當類加載器加載類時,鏈接器的作業將啟動。 鏈接器驗證Java代碼,它是否按照Java語言和JVM中給出的規范編寫。 如果找到有效的Java代碼,則它開始為字段,方法,接口等分配內存。創建對該內存位置的引用。 將引用分配給內存位置后,如果未明確指定,則將所有字段變量,方法,接口等初始化為默認值。 否則,它會將設置的任何值指定為其初始值。

暫無
暫無

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

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