下面請看一段代碼,父類(基類)SuperClass,子類(派生類)SubClass
class SuperClass {
private int n;
SuperClass(int n) {
System.out.println("SuperClass(" + n + ")");
}
}
class SubClass extends SuperClass {
private int n;
SubClass() {
super(300)
System.out.println("SubClass()");
}
SubClass(int n) {
System.out.println("SubClass(" + n + ")");
}
}
public class TestSuperSub {
public static void main(String args[]) {
SubClass s = new SubClass();
}
}
上面這裏,我們在main裏面實例化了SubClass,且構造函數沒有傳參,請問編譯的時候會不會出錯?
答案:
編譯會出錯,由於在子類中,重載的構造方法裏面,沒有顯式調用父類的構造方法,
所以系統會默認去調用父類的無參數構造方法,由於父類沒有定義無參數構造方法,所以編譯會報錯
由於編譯器在編譯過程中是靜態編譯的,所有的代碼都會檢查一遍是否有語法上的錯誤
而寫了太多javascript的我剛開始的時候,以解釋形的過程去理解,搞不清楚爲什麼會報錯,真的是有毒
關於在構造方法中,調用super([參數]),this([參數])
需要注意的是,在構造方法中
- super([參數])只能在第一行
- this([參數])只能在第一行
所以在構造方法第一行中,調用super,就不能再調用this; 反之 調用了this,就不能再調用super
class SuperClass {
private int n;
SuperClass(int n) {
System.out.println("SuperClass(" + n + ")");
}
}
class SubClass extends SuperClass {
private int n;
SubClass() {
this(300);
System.out.println("SubClass()");
}
SubClass(int n) {
super(n);
System.out.println("SubClass(" + n + ")");
}
}
public class TestSuperSub {
public static void main(String args[]) {
SubClass s = new SubClass();
}
}
從main進來,SubClass實例化.調用的是無參數的構造方法
然而在無參數的構造方法中,第一行調用的this(300),此時就不會再隱式調用super()了
而是進入SubClass另外的構造函數,在這裏纔會實例化父類SuperClass的對象
得出結論: 父類的對象只會被實例化一次,也就是super([參數])只會被調用一次
多態執行問題
“成員變量,靜態方法看左邊(父類);非靜態方法:編譯看左邊,運行看右邊(子類)。”
多態的必要條件
- 要有繼承
- 要有重寫
- 父類引用指向子類對象