Java 在創建對象的時候會要執行它的構造函數。不僅如此,Java 還要執行父類的構造函數,往上一級一級直到沒有父類為止。對於初學者來說,有三個問題不容易搞懂:
1、父類的構造函數是否一定會執行?
2、是先執行子類的構造函數還是先執行父類的構造函數?
3、如果父類有多個構造函數,那麼 Java 會選擇哪一個?
- 父類的構造函數是否一定會執行?
是的,父類的構造函數一定會執行。所以如果某個類的層次很深,那麼它創建對象時就會要執行一大堆的構造函數。
- 是先執行子類的構造函數還是先執行父類的構造函數?
Java 會順著繼承結構往上一直找到 Object,然後從 Object 開始往下依次執行構造函數。先執行父類的構造函數,那麼子類的構造函數執行的時候就不需要擔心父類的成員是否初始化好了。
- 如果父類有多個構造函數,那麼 Java 會選擇哪一個?
如果父類有多個構造函數,那麼子類可以在構造函數中選擇其中一個(且最多只能選擇一個)來執行。如果子類沒有選擇,那麼 Java 將會執行父類的缺省構造函數。下面是一個例子:
父類:
view plaincopy to clipboardprint?
public class SuperClass {
public SuperClass() {
System.out.println("super class constructed.");
}
public SuperClass(String name) {
System.out.println("super class constructed with name: " + name);
}
}
public class SuperClass {
public SuperClass() {
System.out.println("super class constructed.");
}
public SuperClass(String name) {
System.out.println("super class constructed with name: " + name);
}
}
子類:
view plaincopy to clipboardprint?
public class SubClass extends SuperClass {
public SubClass() {
System.out.println("sub class constructed.");
}
public SubClass(String name) {
//這一句在語法上不是必須的。但有沒有這一句,執行起來不一樣。有了這一句,就表示子類的構造過程中調用
//的是父類的帶字符串參數的構造函數,也就是 public SuperClass(String name) 這個方法。如果沒有這一
//句,就表示子類的構造過程中調用的是父類的缺省構造函數。
super(name);
System.out.println("sub class constructed with name: " + name);
}
public static void main(String[] args) {
new SubClass();
new SubClass("world");
}
}
public class SubClass extends SuperClass {
public SubClass() {
System.out.println("sub class constructed.");
}
public SubClass(String name) {
super(name);
System.out.println("sub class constructed with name: " + name);
}
public static void main(String[] args) {
new SubClass();
new SubClass("world");
}
}