1. 程式人生 > >Java——static靜態塊的執行順序

Java——static靜態塊的執行順序

 在學習類的載入順序的時候,static塊,即靜態塊的執行順序是一個重點。在面試的時候這一塊也是重點區域,所以需要深入地瞭解靜態塊。

今天就來認識一下static塊到底有什麼樣的特性,使得眾多公司面試時都繞不開這一關。

我們先來了解一下靜態塊是什麼:

static程式碼塊也叫靜態程式碼塊,是在類中獨立於類成員的static語句塊,可以有多個,位置可以隨便放,它不在任何的方法體內,JVM載入類時會執行這些靜態的程式碼塊,如果static程式碼塊有多個,JVM將按照它們在類中出現的先後順序依次執行它們,每個程式碼塊只會被執行一次。

光看文字的話一時半會也瞭解不深,還是老規矩,我們先上程式碼。

來呀! 阿福!上程式碼!!!!!

public class TestClass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ParentClass pa = new ParentClass();
		
	}

}


public class ParentClass {
	static int num = 0;
	String name = "Searchin";
	static String name2 = "FunKaQiu";
	static ParentClass parentClass = new ParentClass();
	ParentClass(){
		System.out.println("這裡是建構函式*************");
	}
	{
		System.out.println("name1:" + name);
		System.out.println("這裡是塊1============");
	}
	static {
		num += 1;
		System.out.println("name2:" + name2);
		System.out.println("這裡是靜態初始化塊*************" + num);
	
	}
	
}

上文的程式定義了兩個類, ParentClass類中定義了兩個static變數、一個static物件、一個static塊,以及一個建構函式和構造塊。 

大家覺得程式執行的結果會是什麼呢?

按照上文中說的,static塊優先順序高於構造塊,那麼將先執行靜態塊中的內容,如果靜態變數在定義的時候就賦給了初值(如 static int X=100),那麼賦值操作也是在類載入的時候完成的,而static同級則按順序執行。

 

會是這樣嗎?我們來看看。

執行結果:

可以看到,構造塊執行了狼此,靜態初始化只執行了一次。似乎沒有什麼問題,認真的人也許會發現,上文中說到static塊的優先順序比構造塊和建構函式快,可為什麼這裡卻是先執行了塊一和建構函式,隨後才執行的static塊呢?

你知道為什麼嗎?先想想?

好啦,告訴你答案。

static塊的優先順序的確是高於構造塊和建構函式,因此它會先於它們執行。但是我們知道,上文中的程式有四個static,它們同級之間按順序執行。

也就是先定義了兩個static變數,然後再定義一個static物件。隨後再執行static塊。

可是按這樣說的話,也是先執行了static再執行別的呀,那為什麼是先執行塊一和建構函式呢?

問題就出在static物件這裡。

static ParentClass parentClass = new ParentClass();

這語句在ParentClass類中new了一個ParentClass的例項物件parentClass,這時候按照類的載入順序,會進入ParentClass類中進行載入。

而由於static只在類第一次載入的時候初始化一次,因此前兩個static變數由於之前已經載入過一次了,因此這裡不會載入。
在TestClass類中第一次例項化ParentClass物件,此時進行第一次載入。

static ParentClass parentClass = new ParentClass();

因此當在new parentClass的時候,帶有static的都不會載入。

它只會執行塊一和建構函式。執行完之後再返回,這個時候才輪到static塊執行。因此會出現上面的輸出結果。

好啦

通過上面的程式我們初步瞭解了static的特性,我們可以再思考一個問題,如果我把static ParentClass parentClass = new ParentClass();這個語句中的static去掉,那麼將會程式執行結果會是怎麼樣的呢?

......

好啦,我們執行一下試試看。

可以發現,這裡先執行了static塊,隨後再執行new parentClass,而new 的過程中又會巢狀地new下一個parentClass,這樣就造成了死迴圈,因此它會報“StackOverflowError”的語句。

可能有人會問,為什麼剛才有static的時候就不會進入死迴圈啦?

哈哈,因為static只在類第一次載入的時候執行一次呀~~

好啦,以上就是static塊執行順序的相關內容,如果大家發現文中有什麼描述不對的地方,歡迎大家留言評論,我們一起學習呀~~

Biu~~~~~~