Java之靜態與非靜態代碼塊

靜態代碼塊

靜態代碼塊只在類加載時執行一次

public class Test {

	static{
		System.out.println("靜態代碼塊");
	}

	public static void main(String[] args) {
		
	}
	//運行時會對這個Test類進行加載,即會執行static中的語句
}

非靜態代碼塊每次創建對象時都會執行

public class Test {

	{
		System.out.println("非靜態代碼塊");
	}

	public static void main(String[] args) {
		new Test();
		new Test();
	}
	//加載此類是不執行,只有創建此類的一個對象時才執行
}

靜態與非靜態代碼塊的相互調用

由於static(靜態)修飾的Java元素(成員變量、方法、代碼塊)早於非static(非靜態)修飾的Java元素分配地址空間
故靜態方法或代碼塊中不能“直接”使用非靜態元素(尚未分配地址無法使用)
但可以通過創建一個對象來間接使用成員變量
而非靜態的Java元素則可以直接使用靜態元素

package soon;

public class Test {

	private String name = "Jim";
	
	static {
		System.out.println("靜態代碼塊");
		//System.out.println(name);靜態代碼塊不能直接調用非靜態的元素
		System.out.println(new Test().name);//但可以通過創建對象來間接調用非靜態元素
	}
	
	public static void test(){
		//System.out.println(name);靜態方法不能直接調用非靜態的元素
		System.out.println(new Test().name);
	}
	
	{
		System.out.println("非靜態代碼塊");
	}
	
	public static void main(String[] args) {
		new Test().test();
	}
}

輸出結果:

靜態代碼塊
非靜態代碼塊
Jim
非靜態代碼塊
非靜態代碼塊
Jim
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章