jvm類初始化條件
阿新 • • 發佈:2018-12-16
1.虛擬機器啟動時,指定一個要執行的主類,虛擬機器會優先初始化這個(帶main方法的)主類
public class TestMode {
static {
System.out.println("會觸發類的初始化");
}
public static void main(String[] args) {
}
}
2.通過陣列定義來引用類,不會觸發類的初始化
class Test { static { System.out.println("通過陣列定義來引用類,不會觸發類的初始化"); } } public class TestMode { private static Test test1; private static Test test; public static void main(String[] args) { Test[] testModes = new Test[] { test, test1 }; for (int m = 0; m < testModes.length; m++) { System.out.println(testModes[m]); } } }
3.訪問一個類的非final靜態欄位或static方法時(訪問fianl欄位時直接從該類常量池中拿取,並不會造成初始化)
class test {
static int a = 1;
static {
System.out.println("hello");
}
}
public class newtestdemo_1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(test.a);
}
}
結果為 hello 1
4.遇到new、getstatic、putstatic或invokestatic這四條位元組碼指令時
class test {
static {
System.out.println("hello");
}
}
public class newtestdemo_1 {
public static void main(String[] args) {
new test();
}
}
5.使用反射機制等
class test { static { System.out.println("hello"); } } public class newtestdemo_1 { public static void main(String[] args) throws ClassNotFoundException { Class.forName("caogao1.test"); } }
6.當初始化一個類的時候,如果發現其父類還沒有進行過初始化,則需要先觸發其父類的初始化
class test01 {
static {
System.out.println("hello");
}
}
class test02 extends test01 {
static {
System.out.println("world");
}
}
public class newtestdemo_1 {
public static void main(String[] args) throws ClassNotFoundException {
new test02();
}
}