Java 基本・派生クラス間の関数オーバーライド

基本クラスとその派生クラスに同じ名前の関数がある場合は、
引数のデータ型や引数の個数が
1つでも違っていれば呼び分ける事ができますが、

引数のデータ型、
引数の個数が全く同じだったら呼び分ける事ができるでしょうか?

例えば、基本クラスにshow関数があったとします。
そして、その派生クラスにもshow関数があったとします。
さらに、それぞれのshow関数は、
引数のデータ型、個数が全く同じだとします。

全く同じなので、オーバーロード機能では解決できません。

こういう場合、派生クラスでshow関数が再定義された事によって、
基本クラスのshow関数が
派生クラスのshow関数によって上書きされ、
見えなくなります

これをオーバーライドと言います。

オーバーライドすれば、
関数の内容を全く新しいコードに書き換える事が可能です。

オーバーライド実装例

/********** 基本クラス **********/
class kihon {

      public void show() {
            System.out.println("基本クラス:show()");
      }

}

/********** 派生クラス **********/
class hasei extends kihon {

      public void show() {
            System.out.println("派生クラス:show()");
      }

}

public class Cmain {

      public static void main(String[] args) {
            kihon a = new kihon();
            hasei b = new hasei();
            a.show();      // 通常通り基本クラスのshow関数が呼ばれる
            b.show();      // オーバーライドしたshow関数が呼ばれる
      }
}

このプログラムには、
基本クラスとその派生クラスにshow関数があります。

しかし、オーバーライドにより、
適切に呼び分けられています。

オーバーライドする関数は、
引数のデータ型、引数の個数が同じ事に加えて、
戻り値も一致させる必要があります。


オーバーライドした関数内の処理は、
オーバーライドされた基本クラスの関数内容の処理を含む場合があるので、

オーバーライドした関数内で
オーバーライドされた
基本クラスの関数を呼ぶ事ができるようになっています。

実装例

/********** 基本クラス **********/
class kihon {

      public void show() {
            System.out.println("基本クラス:show()");
      }

}

/********** 派生クラス **********/
class hasei extends kihon {

      public void show() {
            super.show();
            System.out.println("派生クラス:show()");
      }

}

public class Cmain {

      public static void main(String[] args) {
            hasei b = new hasei();
            b.show();
      }
}

派生クラスのshow関数内で、
基本クラスのshow関数を呼びたいので、
superを使って呼び出しています。

superを付けずにshow();とすると、
派生クラス、つまり自分自身のshow関数を呼び出す。
と言う意味になってしまい、
再帰処理になってしまいます。