繼承_super()

創建子類實例時,會先執行父類構造函數定義的流程,再執行子類構造函數定義的流程。如下例:

    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()只能擇一調用,並且一定要在構造函數的第一行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章