創建子類實例時,會先執行父類構造函數定義的流程,再執行子類構造函數定義的流程。如下例:
class Some{
Some(){
System.out.println("調用Some()");
}
}
class Other extends Some{
Other (){
System.out.ptintln("調用Other()");
}
}
如果執行new Other(),是先執行Some()中的流程,再執行Other中的流程,也就是顯示結果爲:
調用Some()
調用Other()
繼續看原因:
我們知道,父類中可以重載多個構造函數,如果子類構造函數中沒有指定執行父類的哪一個構造函數,默認就會調用父類的無參構造函數。如果想要執行其他某一個構造函數,可以使用super()指定,例如:
class Some{
Some(){
System.out.println("調用Some()");
}
Some(int i){
System.out.println("調用Some(int i)");
}
}
class Other extends Some{
Other (){
super(10); //指定某一構造方法,不一定打印輸出。
System.out.ptintln("調用Other()");
}
}
在這個例子中,new Other()時,首先執行了super(10),表示調用構造函數時傳入int數值10,也就是調用父類中Some(int i)版本的構造函數,而後再繼續執行Other()中super(10)之後的流程。
重點來了,其實當你這麼撰寫時:
class Some{
Some(){
System.out.println("調用Some()");
}
}
class Other extends Some{
Other (){
System.out.ptintln("調用Other()");
}
}
前面談過,如果子類的構造函數中沒有指定調用父類的哪一個構造函數,那麼默認調用父類的無參構造函數,也就相當於你這麼寫:
class Some{
Some(){
System.out.println("調用Some()");
}
}
class Other extends Some{
Other (){
super(); //super()默認省略。
System.out.ptintln("調用Other()");
}
}
注意:
this()與super()只能擇一調用,並且一定要在構造函數的第一行。