オーバーロードとオーバーライド
オーバーロード と オーバーライドについてみてきました。今回は復習として両方を混合してみていきたいと思います。
サンプル
【SuperClass.java】
class SuperClass {
//メソッド
void method(){
System.out.println("スーパークラス : メソッド");
}
//メソッド
void method(int x){
System.out.println("スーパークラス : メソッド(引数あり)");
}
}

スーパークラスではメソッドを2つ用意しました。2つともメソッド名は「method」で仮引数の型や個数が違う「オーバーロード」です。仮引数の型や個数が違うので、引数のパターンからどの「method」メソッドを実行するのか区別できます。
【SubClass.java】
class SubClass extends SuperClass {
//メソッド
void method(){
System.out.println("サブクラス : メソッド");
}
void method(char x){
System.out.println("サブクラス : メソッド (引数あり)");
}
}

「SubClass」は「SuperClass」を継承しているので「SuperClass」の2つのメソッドを引き継ぎます。さらに「SubClass」でも同じ名前のメソッドを2つ追加しました。
「SubClass」で追加した2つの「method」メソッドについて詳しくみていきます。
void method(){
3行目で宣言したメソッドです。メソッド名「method」で引数なしのパターンはスーパークラスで既に宣言しています。このままでは引数なしの「method」メソッドを呼び出したときにスーパークラスで宣言したメソッドなのかサブクラスで宣言したメソッドなのかわかりません。そこでこのような場合はサブクラスで宣言したメソッドを実行します。実質スーパークラスのメソッドをサブクラスで上書きしたことになり、このような処理を「オーバーライド」といいます。
void method(char x){
6行目で宣言したメソッドです。仮引数が char型の「method」メソッドはスーパークラスにはありません。よってこのメソッドの追加は拡張です。しかし「method」という名前は他に既にあるのでオーバーロード対象のメソッドになります。
【Sample.java】
public class Sample {
public static void main(String[] args) {
SubClass obj = new SubClass();
obj.method();
obj.method(1);
obj.method('a');
}
}
スーパークラス : メソッド(引数あり)
サブクラス : メソッド (引数あり)
「SubClass」で利用できるメソッドは、引数パターンが異なる「method」メソッド3種類でした。
4行目は引数がありません。引数のないパターンはスーパークラスにもサブクラスにもありましたが、オーバーライドによりサブクラスの宣言で上書きされています。サブクラスの処理が実行されていることがわかります。5行目は int型の引数をもつパターンです。スーパークラスで宣言しそのまま継承されています。6行目はchar型の引数をもつパターンです。サブクラスで新規に宣言しました。
以上で「オーバーロード」と「オーバーライド」についてみてきました。同じ名前のメソッド名を複数扱うなど似ている箇所もありますが、意味や処理が全く違うので間違えないように注意してください。
2010 年 6 月 18 日 金曜日 【 カテゴリー: Javaの基本 】
