Java 繼承(子類構造函數重載的問題)

下面請看一段代碼,父類(基類)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([參數])只會被調用一次



多態執行問題

“成員變量,靜態方法看左邊(父類);非靜態方法:編譯看左邊,運行看右邊(子類)。”

多態的必要條件

  • 要有繼承
  • 要有重寫
  • 父類引用指向子類對象
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章