中的行爲有所不同在學習Java認證測試時,我瞭解到靜態初始化塊在加載類時運行一次,按照源代碼中的外觀順序運行,該實例每次創建實例時都會運行初始化塊,並且每次在此之後創建實例時,構造函數中的代碼都會運行。爲了測試我創建了一個包含一些靜態和實例init塊的類以及一個包含打印內容的構造器。一切按預期工作 - 除了我認爲「加載」意味着在運行時,但我想這是在創建第一個實例時發生的,因爲除非創建至少一個類實例,否則我根本沒有得到任何輸出。然後我試着用enum來試試,命令全部關閉。首先,枚舉首次在代碼中被引用時,初始化塊爲枚舉所具有的每個值運行一次 - 其次,在我假設的實例init塊之後,標記爲靜態運行的init塊!這與我的預期相反。這是我的問題的細分。爲什麼Enums中的靜態和實例初始化塊的行爲與類
- 爲什麼標記爲靜態的init塊在枚舉中最後運行?
- 枚舉是否可以有實例init塊?
- 爲什麼我認爲塊實例初始化塊只運行一次枚舉加載時,而不是每次一個新的枚舉值被引用?
- 當類被「加載」時,類靜態初始化塊運行。加載意味着什麼?在類中實例化對象時會發生一次嗎?
謝謝!這對我來說非常混亂。
public class EnumInit {
public static void main(String[] args) {
System.out.println(Color.RED.toString() + " Main");
MyInit myInit = new MyInit();
System.out.println(Color.BLUE.toString() + " Main");
MyInit mySecondInit = new MyInit();
}
}
enum Color {
RED, BLUE, GREEN;
String instanceVar = "Enum Instance Variable Text";
static { System.out.println("Enum Static init block 1"); }
{ System.out.println("Enum Instance init block 1"); }
static { System.out.println("Enum Static static init block 2"); }
Color() {
System.out.println(instanceVar);
System.out.println("Enum String Literal");
}
{ System.out.println("Enum Instance init block 2"); }
}
class MyInit {
String instanceVar = "Class Instance Variable Text";
static { System.out.println("Class Static init block 1"); }
{ System.out.println("Class Instance init block 1"); }
static { System.out.println("Class Static static init block 2"); }
MyInit() {
System.out.println(instanceVar);
System.out.println("Class String Literal");
}
{ System.out.println("Class Instance init block 2"); }
}
#4:類沒有加載,直到他們有有意義的使用。這可能是調用類的靜態方法,或創建一個實例,或者調用Class.forName()或其他。我相信這是爲了將當前加載到perma gen的類的數量降到最低。 –