JAVA中新建一個子類的執行過程
初始化過程是這樣的:
1.首先,初始化父類中的靜態成員變數和靜態程式碼塊,按照在程式中出現的順序初始化;
2.然後,初始化子類中的靜態成員變數和靜態程式碼塊,按照在程式中出現的順序初始化;
3.其次,初始化父類的普通成員變數和程式碼塊,在執行父類的構造方法;
4.最後,初始化子類的普通成員變數和程式碼塊,在執行子類的構造方法;
以上是一般過程,首先一開始先初始化的是靜態成員變數和靜態程式碼塊是因為這些程式碼在累載入的時候就載入進記憶體了,已經執行過一遍了(這個相信大家都是知道,就不再演示了),類中的其他程式碼塊是在物件建立的時候才會去執行,比如建構函式。
新建子類的時候,先假設麼沒有靜態變數等,執行過程:父類的預設構造方法->子類的構造方法;但是如果在子類的構造方法中明確呼叫父類的哪個構造方法,那麼執行結果是不一樣的。例如
class A {
A() {
this("A");
System.out.print("A");
}
A(String s) {
System.out.print(s);
}
}
1
class Test extends A {
Test() {
super("B");//顯示呼叫的父類的構造方法方法
System.out.print("B");
}
}
2
class Test extends A {
Test() {
super();//呼叫的父類方法和上面一種是不一樣的,而且就算在這邊不寫super(),預設也會呼叫super(),不信你試試
System.out.print("B");
}
}
此外,希望大家明白以下兩句話中紅色字是什麼意思:
3.其次,初始化父類的普通成員變數和程式碼塊,在執行父類的構造方法;
4.最後,初始化子類的普通成員變數和程式碼塊,在執行子類的構造方法;
舉個例子:
class C {
C() {
System.out.print("C");
}
}
class A {
C c = new C();
A() {
System.out.print("A");
}
A(String s) {
System.out.print(s);
}
public static void main(String[] args) {
new A();
}
}
執行結果如下:
CA
看見木有,是先執行C c = new C();再執行A的建構函式的哦