關於Java的靜態初始化塊

       這裏我們主要討論下靜態初始化塊這種情況。

       靜態初始化塊是在類被加載的時候就執行的一塊程序,並且一直存在直到程序關閉。也就是說當程序被執行,即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類的執行優先順序

該類的靜態變量->該類的靜態初始化塊->該類的構造方法

若存在父類的情況下則是:

父類的靜態變量->父類的靜態初始化塊->子類的靜態變量->子類的靜態初始化塊

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