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~~~~~~