類初始化順序

前些日至寫代碼的時候又碰到一個問題,類似于這樣:


image.png

子類調用父類的構造器,傳入自身的非靜態成員變量,編譯器會報錯
依稀記得以前整理過,所以又去寫了一遍相關的測試,代碼如下:

public class Child extends Parent{
    static String flag = "Child:";
    Msg msg = new Msg(flag+"field");
    static Msg msgs = new Msg(flag+"static field");
    static {
        List<Msg> list = Arrays.asList(new Msg(flag+"static area"));
    }
    public Child(){
        System.out.println(flag+"init");
    }
}
public class Parent extends GrantParent{
    static String flag = "Parent:";
    Msg msg = new Msg(flag+"field");
    static Msg msgs = new Msg(flag+"static field");
    static {
        List<Msg> list = Arrays.asList(new Msg(flag+"static area"));
    }
    public Parent(){
        System.out.println(flag+"init");
    }
}
public class GrantParent {
    static String flag = "GrantParent:";
    Msg msg = new Msg(flag+"field");
    static Msg msgs = new Msg(flag+"static field");
    static {
        List<Msg> list = Arrays.asList(new Msg(flag+"static area"));
    }
    public GrantParent(){
        System.out.println(flag+"init");
    }
}
public class Msg {
    public Msg(String str){
        System.out.println(str);
    }
}
 @org.junit.Test
    public void testInit(){
        Child child = new Child();
    }

輸出為:

image.png

由此可以總結出,java類初始化的順序為:
1.由基類到導出類的靜態成員變量和靜態代碼塊的初始化執行
2.1執行完后,再由基類到導出類的成員變量和構造器的初始化執行,同級的成員變量早于構造器被初始化

所以開頭的問題很容易解釋,因為基類的構造器早于導出類的非靜態成員的初始化

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 當類第一次加載到內存中的時候初始化 父類靜態成員和靜態初始化塊,按在代碼中出現的順序依次執行。 子類靜態成員和靜態...
    王簡書2009閱讀 277評論 0 0
  • 開始記錄之前,我想先上一張圖片,這是書本上給出的代碼示例,不知道大家的第一感覺是什么,反正我第一次看到這段代碼的時...
    怡紅快綠閱讀 292評論 0 0
  • 前言 做Java開發將近一年半了,雖然之前系統地學習過Java,但是實踐出真知,最近總感覺還有好多知識點沒有掌握,...
    pro090701閱讀 255評論 0 0
  • 1.靜態代碼塊,靜態變量,按代碼順序先后執行.2.構造代碼塊,成員變量,按代碼順序先后執行.3.先執行構造塊或成員...
    聽說我很強閱讀 411評論 0 0
  • 1、今天,朋友圈里很多人在祭奠八年前那場地動山搖中逝去的生命。所以,親愛的,我們要善待自己的生命,讓每天都往幸福那...
    長征閱讀 279評論 0 0