1. 程式人生 > 其它 >靜態程式碼塊與類的載入過程

靜態程式碼塊與類的載入過程

筆試過程中經常遇到靜態程式碼塊與類的載入過程的選擇題:

程式碼塊的特點:隨著類的載入而載入;優先於物件存在;修飾的成員被所有物件共享;訪問許可權允許時,可不建立物件,直接被類呼叫。靜態程式碼塊中只能呼叫靜態屬性或者靜態方法;非靜態程式碼塊可以呼叫靜態與非靜態的屬性或方法。

程式碼塊的作用:對java類或物件進行初始化。

非靜態程式碼塊:隨著物件的建立而執行;每建立一次物件,都會執行一次,且優先於構造器執行

靜態程式碼塊:隨著物件的建立而執行,隨著類的載入而執行且只被載入一次;靜態程式碼塊的執行先於非靜態程式碼塊;

如題:

 

 輸出為:

 

 分析:當程式進入主函式,進行到第三行程式碼時,一個new說明要建立一個物件,然後跳入 static Demo d1=new Demo()這行程式碼,由於這裡又new一個物件,因此又進入Demo類,由於d1是靜態物件,已經儲存在方法區中,所以進入程式碼塊輸出line1,然後執行靜態程式碼塊輸出Line2,然後回去對d2繼續執行,由於靜態程式碼塊只執行一次,因此又輸出lin1。這裡有一個問題,為什麼new d1的時候先執行的程式碼塊然後再執行的靜態程式碼塊。

 

對於這個程式碼執行new classLoader();這個指令,就很明顯的可以體現,先執行靜態,然後程式碼塊,然後構造器。