/*
SubClass sub = new SubClass();
這句話到底做了什么事情呢?
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.將子類的內存地址賦值給棧中的引用對象。
*/
package com.zhangyike.staticExcise;
// 靜態變量 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(); } }
程序執行的結果為:
父類–靜態變量
父類–靜態塊
子類–靜態變量
子類–靜態塊
順序:第一次new SubClass
父類–普通變量
父類–普通塊
父類–構造器
子類–變量
子類–普通塊
子類–構造器
順序:第二次new SubClass
父類–普通變量
父類–普通塊
父類–構造器
子類–變量
子類–普通塊
子類–構造器