HOME > 継承時のメソッドの呼ばれ方

継承時のメソッドの呼ばれ方

継承時のコンストラクタとメソッドの呼ばれ方をサンプルソースでまとめてみました。

【サンプルで確認できる内容】
 ・デフォルトコンストラクタの呼ばれ方
 ・引数ありコンストラクタの呼ばれ方
 ・オーバーライドしていないメソッドの呼ばれ方
 ・オーバーライドしているメソッドの呼ばれ方

クラスの継承図

サンプルソース

親クラスでは、コンストラクタ(引数あり、なし)、メソッド1、メソッド2を定義します。

親クラス

SuperClass.java
public class SuperClass {

    //コンストラクタ(引数なし)
    public SuperClass(){
        System.out.println("Super-con");
    }

    //コンストラクタ(引数あり)
    public SuperClass(String str){
        System.out.println("Super-con2");
    }

    //メソッド1
    public void m1(){
        System.out.println("super-m1");
    }

    //メソッド2
    public void m2(){
        System.out.println("super-m2");
    }
}


子クラスでは、コンストラクタ(引数あり、なし)とメソッド2をオーバーライドします。

子クラス

SubClass.java
public class SubClass extends SuperClass {

    //コンストラクタ(引数なし)
    public SubClass(){
        System.out.println("SubClass-con");
    }

    //コンストラクタ(引数あり)
    public SubClass(String str){
        System.out.println("SubClass-con2");
    }

    //メソッド2をオーバーライド
    public void m2(){
        System.out.println("sub-m2");
    }
}



実行クラスで子クラスを実行してみましょう。

実行クラス

ExtendsTest.java
public class ExtendsTest {

    public static void main(String[] args) {

        //子クラスをインスタンス化(引数なし)
        SubClass sc1 = new SubClass();
        sc1.m1();    //親クラスメソッドを呼出
        sc1.m2();    //オーバーライドメソッドを呼出

        System.out.println();

        //子クラスをインスタンス化(引数あり)
        SubClass sc2 = new SubClass("hoge");
        sc2.m1();    //親クラスメソッドを呼出
        sc2.m2();    //オーバーライドメソッドを呼出
    }

}

実行結果

コマンドプロンプト
C:\>java ExtendsTest Super-con SubClass-con super-m1 sub-m2 Super-con SubClass-con2 super-m1 sub-m2

結果として以下の事がいえます。

・親クラスのコンストラクタは子クラスのコンストラクタが実行される前に実行される
・コンストラクタをオーバーロードしても、呼ばれる親クラスのコンストラクタはデフォルトコンストラクタ。
・オーバーライドしていないメソッドは親クラスのメソッドがそのまま呼ばれる
・オーバーライドしているメソッドは子クラスのメソッドが呼ばれ、親クラスのメソッドは呼ばれない




ちなみに、子クラスの引数ありコンストラクタに、明示的に記述すれば、引数ありの親クラスコンストラクタが呼ばれるようになります。

引数ありコンストラクタを明示的に呼ぶ
//コンストラクタ(引数あり)
public SubClass(String str){
    super(str);
    System.out.println("SubClass-con2");
}


また、子クラスのメソッド内に明示的に親クラスのメソッドを呼ぶように記述すれば、オーバーライドする前の親クラスのメソッドを呼ぶことも出来ます。

オーバーライド元のメソッドを明示的に呼ぶ
//メソッド2をオーバーライド
public void m2(){
    super.m2();
    System.out.println("sub-m2");
}