1. 程式人生 > >jvm類初始化條件

jvm類初始化條件

 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();
	}

}