Java類加載時一定會執行靜態代碼塊嗎?

答案是:不一定!

1.如下代碼運行:

package com.java.oop;
/**
 * 類加載時一定會執行靜態代碼塊嗎?不一定
 */
class ClassC{
	static {
		System.out.println("ClassC.static");
	}
}
class ClassD extends ClassC{
	static {
		System.out.println("ClassD.static");
	}
}
public class TestClassObject04 {
	public static void main(String[] args)throws Exception {
		ClassLoader loader=
		ClassLoader.getSystemClassLoader();
		loader.loadClass("com.java.oop.ClassC");
	}
	
}

如下方式運行:

VM argument框輸入參數-XX:+TraceClassLoading 然後run

如下結果

可以看到類被加載了,但是沒有執行ClassC中靜態代碼塊.

2.如下代碼運行

package com.java.oop;
/**
 * 類加載時一定會執行靜態代碼塊嗎?不一定
 */
class ClassC{
	static int c=100;
	static {
		System.out.println("ClassC.static");
	}
}
class ClassD extends ClassC{
	static int d=200;
	static {
		System.out.println("ClassD.static");
	}
}
public class TestClassObject04 {
	public static void main(String[] args)throws Exception {
		ClassLoader loader=
		ClassLoader.getSystemClassLoader();
	
	    Class.forName("com.java.oop.ClassC");
	}
	
}

靜態代碼塊執行.

3.如下代碼運行

package com.java.oop;
/**
 * 類加載時一定會執行靜態代碼塊嗎?不一定
 */
class ClassC{
	static int c=100;
	static {
		System.out.println("ClassC.static");
	}
}
class ClassD extends ClassC{
	static int d=200;
	static {
		System.out.println("ClassD.static");
	}
}
public class TestClassObject04 {
	public static void main(String[] args)throws Exception {
		ClassLoader loader=
		ClassLoader.getSystemClassLoader();

		Class.forName("com.java.oop.ClassC",
				       false,//true表示要對類變量初始化,執行靜態代碼塊,false反之.
				       loader);
		
	}
	
}

靜態代碼塊不執行;但是如把false改爲true

Class.forName("com.java.oop.ClassC",
				       true,//true表示要對類變量初始化,執行靜態代碼塊,false反之.
				       loader);

ClassC靜態代碼塊執行.

4.如下代碼運行

package com.java.oop;
/**
 * 類加載時一定會執行靜態代碼塊嗎?不一定
 */
class ClassC{
	static int c=100;
	static {
		System.out.println("ClassC.static");
	}
}
class ClassD extends ClassC{
	static int d=200;
	static {
		System.out.println("ClassD.static");
	}
}
public class TestClassObject04 {
	public static void main(String[] args){

		//如下輸出,ClassD爲被動加載,其內部靜態代碼塊不會執行
		System.out.println(ClassD.c);//方法ClassC屬性
	}
	
}

ClassD爲被動加載,其內部靜態代碼塊不會執行

5.如下代碼運行

package com.java.oop;
/**
 * 類加載時一定會執行靜態代碼塊嗎?不一定
 */
class ClassC{
	static int c=100;
	static {
		System.out.println("ClassC.static");
	}
}
class ClassD extends ClassC{
	static int d=200;
	static {
		System.out.println("ClassD.static");
	}
}
public class TestClassObject04 {
	public static void main(String[] args){
		//如下輸出,ClassD爲主動加載,其內部靜態代碼塊會執行.
		System.out.println(ClassD.d);//訪問自身屬性
	}
	
}

ClassD爲主動加載,其內部靜態代碼塊會執行.

發佈了37 篇原創文章 · 獲贊 4 · 訪問量 1251
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章