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