我試圖發現初始化發生的順序,或者說是爲什麼初始化按此順序發生的原因。由於代碼:Java靜態初始化命令
public class Main {
{
System.out.printf("NON-STATIC BLOCK\n");
}
static{
System.out.printf("STATIC BLOCK\n");
}
public static Main m = new Main();
public Main(){
System.out.printf("MAIN CONSTRUCTOR\n");
}
public static void main(String... args) {
//Main m = new Main();
System.out.printf("MAIN METHOD\n");
}
}
輸出:
STATIC BLOCK
NON-STATIC BLOCK
MAIN CONSTRUCTOR
MAIN METHOD
然而,在移動m
的聲明之前初始化塊生產:
NON-STATIC BLOCK
MAIN CONSTRUCTOR
STATIC BLOCK
MAIN METHOD
,爲什麼它發生在我完全不知道這個命令。此外,如果我在m
的聲明中刪除了static
關鍵字,則init塊和構造函數都不會觸發。任何人都可以幫我解決這個問題嗎?
請記住,「非靜態塊」中的代碼將被複制到每個構造函數中。只有初始化塊的相對順序很重要,只有在調用構造函數時(看似「之前」)纔會調用它們。 (在靜態初始化程序之前或之後,取決於您將移動的行放在哪裏)。 – millimoose
現在真正奇怪的是,這意味着您可以在類自身完成初始化之前初始化一個類的實例這聽起來像是一個等待發生的奇怪的錯誤。 – millimoose
@millimoose:謝謝 - 我在回答中添加了一些關於實例初始值設定項的內容。 –