1. 程式人生 > >Java中四大代碼塊的運行順序(附code)

Java中四大代碼塊的運行順序(附code)

align ng- extends code static 構造 自己 構造方法 xtend

驗證證的方法是寫code。例如以下:
public class test {

    
    static class A {
        public static String name = "hello";

        static {
            System.out.println("A static block1"); //1
        }

        {
            System.out.println("A block3"); //3
        }

        public A() {
            System.out.println("A constructor4"); //4
        }
    }


    static class B extends A {
        public static String childName = "hello";

        static {
            System.out.println("B static block2"); //2
        }

        {
            System.out.println("B block5"); //5
        }

        public B() {
            System.out.println("B constructor6"); //6
        }
    }

    
    public static void main(String[] args) {
       new B();
    }

}
以上運行結果為:A static block1
B static block2
A block3
A constructor4
B block5
B constructor6

  • 分析:當運行new B()時。它首先去看父類裏面有沒有靜態代碼塊,假設有,它先去運行父類裏面靜態代碼塊裏面的內容。當父類的靜態代碼塊裏面的內容運行完成之後。接著去運行子類(自己這個類)裏面的靜態代碼塊,當子類的靜態代碼塊運行完成之後,它接著又去看父類有沒有非靜態代碼塊,假設有就運行父類的非靜態代碼塊,父類的非靜態代碼塊運行完成。接著運行父類的構造方法;父類的構造方法運行完成之後,它接著去看子類有沒有非靜態代碼塊,假設有就運行子類的非靜態代碼塊。

    子類的非靜態代碼塊運行完成再去運行子類的構造方法,這個就是一個對象的初始化順序。

  • 總結:對象的初始化順序:首先運行父類靜態的內容,父類靜態的內容運行完成後,接著去運行子類的靜態的內容,當子類的靜態內容運行完成之後,再去看父類有沒有非靜態代碼塊。假設有就運行父類的非靜態代碼塊,父類的非靜態代碼塊運行完成,接著運行父類的構造方法。父類的構造方法運行完成之後,它接著去看子類有沒有非靜態代碼塊,假設有就運行子類的非靜態代碼塊。子類的非靜態代碼塊運行完成再去運行子類的構造方法。總之中的一個句話,靜態代碼塊內容先運行,接著運行父類非靜態代碼塊和構造方法,然後運行子類非靜態代碼塊和構造方法。
  • 註意:子類的構造方法,無論這個構造方法帶不帶參數,默認的它都會先去尋找父類的不帶參數的構造方法。假設父類沒有不帶參數的構造方法,那麽子類必須用supper關鍵子來調用父類帶參數的構造方法,否則編譯不能通過。


Java中四大代碼塊的運行順序(附code)