class A {
private static String staticStr = getStaticStr();
private String str = getStr();
static {
System.out.println("A的靜态塊");
}
{
System.out.println("A的執行個體塊");
}
public A() {
System.out.println("A的構造方法");
}
private static String getStaticStr() {
System.out.println("A的靜态屬性初始化");
return null;
}
private String getStr() {
System.out.println("A的執行個體屬性初始化");
return null;
}
}
class B extends A {
private static String staticStr = getStaticStr();
private String str = getStr();
static {
System.out.println("B的靜态塊");
}
{
System.out.println("B的執行個體塊");
}
public B() {
System.out.println("B的構造方法");
}
private static String getStaticStr() {
System.out.println("B的靜态屬性初始化");
return null;
}
private String getStr() {
System.out.println("B的執行個體屬性初始化");
return null;
}
public static void main(String[] args) {
new B();
new B();
}
}
輸出結果是:
A的靜态屬性初始化
A的靜态塊
B的靜态屬性初始化
B的靜态塊
A的執行個體屬性初始化
A的執行個體塊
A的構造方法
B的執行個體屬性初始化
B的執行個體塊
B的構造方法
A的執行個體屬性初始化
A的執行個體塊
A的構造方法
B的執行個體屬性初始化
B的執行個體塊
B的構造方法
由此可見,執行個體化子類的時候,若此類未被加載過,首先加載是父類的類對象,然後加載子類的類對象,接着執行個體化父類,最後執行個體化子類,若此類被加載過,不再加載父類和子類的類對象。接下來是加載順序,當加載類對象時,首先執行靜态屬性初始化,然後執行靜态塊,當執行個體化對象時,首先執行執行個體塊,然後執行構造方法,至于各靜态塊、執行個體塊之間的執行順序,是按代碼的先後順序