這裏我們主要討論下靜態初始化塊這種情況。
靜態初始化塊是在類被加載的時候就執行的一塊程序,並且一直存在直到程序關閉。也就是說當程序被執行,即classloader將該java程序編譯後的class文件加載後,就能執行到靜態初始化塊這段程序;當程序關閉,我的個人理解也就是java.exe進程被結束的時候,靜態初始化塊結束(例如在靜態初始化塊裏對一個類的靜態變量進行賦值,該變量一直存在到程序關閉)。
下面我們來舉例說明:
public class Test {
//靜態變量
public static String testStatic = "testStatic";
//靜態初始化塊
static {
System.out.println(testStatic);
System.out.println("Proc begin");
testStatic = "testProc";
System.out.println("Proc end");
}
//主方法
public static void main(String[] args) {
System.out.println(testProc);
System.out.println("main begin");
System.out.println("main end");
}
}
執行main方法輸出結果:
testStatic
Proc begin
Proc end
testProc
main begin
main end
也就是說當JVM將要執行main方法的時候,先要將Test.class加載到JVM中,此時就執行了靜態初始化塊中的程序;然後再執行執行main方法中的程序。這個例子沒有將這個類實例化,所以沒有用到構造函數。倘若需要實例化該類的時候,則構造方法的執行順序也是在靜態初始化塊之後的。
最後我們可以得出這麼一個結論:Java類的執行優先順序
該類的靜態變量->該類的靜態初始化塊->該類的構造方法
若存在父類的情況下則是:
父類的靜態變量->父類的靜態初始化塊->子類的靜態變量->子類的靜態初始化塊