基本クラスとその派生クラスに同じ名前の関数がある場合は、
引数のデータ型や引数の個数が
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関数を呼び出す。
と言う意味になってしまい、
再帰処理になってしまいます。