New一個類的的時候,
- 執行父類的static成員和static代碼塊(按照先後順序)
- 執行子類的static成員和static代碼塊(按照先後順序)
- 執行父類的非static成員字段變量和代碼塊的初始化(按照先後順序)
- 執行父類的構造方法
- 執行子類的非static成員字段變量和代碼塊的初始化(按照先後順序)
- 執行子類的構造方法
記憶方法:從父到子,靜態到非靜態
參考鏈接
package excise;
class A{
static{
System.out.print("a");
}
public A(){
System.out.print("b");
}
}
class B extends A{
static{
System.out.print("c");
}
public B(){
System.out.print("d");
}
}
public class excise {
public static void main(String[] args) {
A b = new B();
b = new B();
}
}
輸出結果:
acbdbd
解析:
易混淆
A b; //定義一個類變量(引用),類型爲A,變量名b
b = new B() //實例化B,並將它賦值給b
而
A b = new B();
b = new B();
new了兩次B(),其實第一次new的B還在,只不過找不到了,只能等待垃圾回收機制釋放,b指向第二次new的B
第一次new的時候,首次static塊會被加載到緩存中,第二次new的時候,不需要重複加載,直接用即可,所以static塊只加載一次