Java中靜態域、靜態塊、非靜態域、非靜態塊、構造函數的執行順序

在Java類被new的過程當中,執行順序以下:函數

  •     實現自身的靜態屬性和靜態代碼塊。(根據代碼出現的順序決定誰先執行)
  •     實現自身的非靜態屬性和非靜態代碼塊。
  •     執行自身的構造函數。

    在實現繼承的類被new的過程當中,初始化執行順序以下:測試

  •     實現父類的公共靜態屬性和靜態塊級代碼。
  •     實現自身的靜態屬性和靜態塊級代碼。
  •     實現父類的非靜態屬性和非靜態代碼塊。
  •     執行父類的構造函數。
  •     實現自身的非靜態屬性和非靜態代碼塊。
  •     執行自身的構造函數。

    1. 靜態代碼塊:code

        static {  
        } 繼承

    2. 非靜態代碼塊it

        {  
        } class

        靜態代碼塊和非靜態代碼塊的異同點以下:test

  •     相同點:都是JVM加載類時且在構造函數執行以前執行,在類中均可以定義多個,通常在代碼塊中對一些static變量進行賦值。
  •     不一樣點:靜態代碼塊在非靜態代碼塊以前執行(靜態代碼塊 > 非靜態代碼塊)。靜態代碼塊只在第一次new時執行一次,以後再也不執行。而非靜態代碼塊每new一次就執行一次。

    驗證例子:
    首先,來看一下無繼承的類初始化時的執行順序,代碼以下:

    public class InitOderTest { 變量

      public static String STATIC_FIELD = "靜態屬性"; 構造函數

      // 靜態塊 static

      static {

        System.out.println(STATIC_FIELD);

        System.out.println("靜態代碼塊");

      }

      public String field = "非靜態屬性";  

      // 非靜態塊

      {

        System.out.println(field);

        System.out.println("非靜態代碼塊");

      }

      public InitOderTest() {

        System.out.println("無參構造函數");

      }

      public static void main(String[] args) {

        InitOderTest test = new InitOderTest();

      }

    }

    執行結果:

  •     靜態屬性 
  •     靜態代碼塊 
  •     非靜態屬性 
  •     非靜態代碼塊 
  •     無參構造函數 
    接下來,咱們驗證一下,當Java類實現繼承後,執行順序。測試代碼以下:

    public class ParentTest {

        public static String PARENT_STATIC_FIELD = "父類-靜態屬性"; 
           
           // 父類-靜態塊 
           static { 
             System.out.println(PARENT_STATIC_FIELD); 
             System.out.println("父類-靜態代碼塊"); 
           } 
           
           public  String parentField = "父類-非靜態屬性"; 
           
           // 父類-非靜態塊 
           { 
             System.out.println(parentField); 
             System.out.println("父類-非靜態代碼塊"); 
           } 
           
           public ParentTest() { 
             System.out.println("父類—無參構造函數"); 
           } 
    }

    public class InitOderTest extends ParentTest{

        public static String STATIC_FIELD = "靜態屬性"; 
           
           // 靜態塊 
           static { 
             System.out.println(STATIC_FIELD); 
             System.out.println("靜態代碼塊"); 
           } 
           
           public String field = "非靜態屬性"; 
           
           // 非靜態塊 
           { 
             System.out.println(field); 
             System.out.println("非靜態代碼塊"); 
           } 
           
           public InitOderTest() { 
             System.out.println("無參構造函數"); 
           } 
           
           public static void main(String[] args) { 
              new InitOderTest(); 
              new InitOderTest(); 
           } 
        }

    執行結果以下:

  •     父類-靜態屬性 
  •     父類-靜態代碼塊 
  •     靜態屬性 
  •     靜態代碼塊 
  •     父類-非靜態屬性 
  •     父類-非靜態代碼塊 
  •     父類—無參構造函數 
  •     非靜態屬性 
  •     非靜態代碼塊 
  •     無參構造函數
相關文章
相關標籤/搜索