java類加載及new對象的過程

SubClass sub = new SubClass(); 
這句話到底作了什麼事情呢? 
java

  1. javac編譯.java源文件造成.class字節碼文件; 
  2. new SubClass()對象時,先檢查有沒有父類,有父類,類加載器(ClassLoader)先將父類的Class文件讀入內存,建立一個java.lang.Class對象,而後加載子類,類加載器將子類的Class文件讀入內存,建立一個java.lang.Class對象; 
  3. 先初始化父類的靜態屬性,再初始化父類的靜態代碼塊; 
  4. 再初始化子類的靜態屬性,再初始化子類的靜態代碼; 
  5. 在堆內存中分配內存空間,分配內存地址,此時是由於父類的特有屬性纔在堆內存中爲父類對象分配空間。 
  6. 初始化父類的特有屬性。 
  7. 初始化父類的構造代碼塊。 
  8. 初始化父類對象相應的構造方法。 
  9. 在堆內存中分配內存空間,分配內存地址,此時是由於子類的特有屬性纔在堆內存中爲子類對象分配空間的。 
  10. 初始化子類的特有屬性。 
  11. 初始化子類的構造代碼塊。 
  12. 初始化子類相應的構造方法。 
  13. 將子類的內存地址賦值給棧中的引用對象。
public class ParentClass {

    // 靜態變量
    public static String staticField = "父類--靜態變量";

    public String field = "父類--普通變量";

    // 靜態塊
    static {
        System.out.println(staticField);
        System.out.println("父類--靜態塊");
    }

    // 初始化塊
    {
        System.out.println(field);
        System.out.println("父類--普通塊");
    }

    // 構造器
    public ParentClass() {
        System.out.println("父類--構造器");
    }
}
public class SubClass extends ParentClass {

    // 靜態變量
    public static String sstaticField = "子類--靜態變量";
    // 變量
    public String sField = "子類--變量";

    // 靜態塊
    static {
        System.out.println(sstaticField);
        System.out.println("子類--靜態塊");
    }

    // 初始化塊
    {
        System.out.println(sField);
        System.out.println("子類--普通塊");
    }

    // 構造器
    public SubClass() {
        System.out.println("子類--構造器");
    }

    public static void main(String[] args) {

        System.out.println("順序:" + "第一次new SubClass");
        SubClass sub = new SubClass();
        System.out.println("順序:" + "第二次new SubClass");
        new SubClass();
    }
}

程序執行的結果爲:  code

父類–靜態變量 
父類–靜態塊 
子類–靜態變量 
子類–靜態塊 

順序:第一次new SubClass 
父類–普通變量 
父類–普通塊 
父類–構造器 
子類–變量 
子類–普通塊 
子類–構造器 

順序:第二次new SubClass 
父類–普通變量 
父類–普通塊 
父類–構造器 
子類–變量 
子類–普通塊 
子類–構造器
相關文章
相關標籤/搜索