小談Java中的靜態塊與非靜態塊

java中經常有一些靜態塊,這是用來在生成類之前進行的初始化,無論java還C++語言中的static,都是最先初始化好的。結構如下:

static {

靜態語句代碼塊

}


{

非靜態語句代碼塊

}

異同點

相同點:都是在JVM加載類時且在構造方法執行之前執行,在類中都可以定義多個,一般在代碼塊中對一些static變量進行賦     值。

不同點:靜態代碼塊在非靜態代碼塊之前執行(靜態代碼塊--》非靜態代碼塊--》構造方法)。

    靜態代碼塊只在第一次new執行一次,之後不在執行,而非靜態代碼塊在每new一次就執行一次。非靜態代碼塊可以     在普通方法中定義(個人感覺作用不大);而靜態代碼塊不行。

 

package com.sample.client;
public class Test {
	public int a;
	
	static {
		System.out.println("Test Static 靜態語句塊");
	}
	public Test() {
		System.out.println("Test 默認無參構造器");
	}
	{
		System.out.println("Test 非靜態");
	}
}
 

package com.sample.client;

public class Test1 extends Test {
	public int i;
	public double d;
	
	static {
		System.out.println("Test1 Static 靜態語句塊");
	}
	
	public Test1 () {
		System.out.println("Test1 默認無參構造器");
	}
	
	{
		System.out.println("Test1 非靜態");
	}
	
	public static void main(String[] args) {
		Test1 t = new Test1();
		
	}
}

 

輸出結果如下:

Test Static 靜態語句塊
Test1 Static 靜態語句塊
Test 非靜態
Test 默認無參構造器
Test1 非靜態
Test1 默認無參構造器

 

小結:

1、靜態代碼塊是在類加載時自動執行的,非靜態代碼塊在創建對象自動執行的代碼,不創建對象不執行該類的非靜態代碼塊。 順序: 靜態代碼塊--》非靜態代碼塊--》類構造方法。

2、在靜態方法裏面只能直接調用同類中其他的靜態成員(包括變量和方法),而不能直接訪問類中的非靜態成員。因爲對於非靜態的方法和變量,需要先創建類的實例對象後方可使用,而靜態方法在使用前不用創建任何對象。

3、如果某些代碼必須要在項目啓動時候就執行的時候,我們可以採用靜態代碼塊,這種代碼是主動執行的;需要在項目啓動的時候就初始化,在不創建對象的情況下,其他程序來調用的時候,需要使用靜態方法,此時代碼是被動執行的。

區別:靜態代碼塊是自動執行的;

 靜態方法是被調用的時候才執行的;

作用:靜態代碼塊可以用來初始化一些項目最常用的變量和對象;靜態方法可以用作不創建對象也可以能需要執行的代碼。

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