オーバーロード
今回はオーバーロードについてみていきます。
オーバーロード
オーバーロードとは同じ名前のメソッドを複数定義することです。しかし同じ名前のメソッドが複数あると、メソッドの呼び出し時にどのメソッドを実行していいのかわからなくなります。そこで同じ名前のメソッドを定義するときには一定の制約があります。
「メソッド名、仮引数の型、仮引数の数」の組み合わせが全く同じメソッドは重複して作成できない
オーバーロードはメソッド名が同じです。同じメソッド名が複数あるとメソッド名だけではどれを実行していいのか判断できません。そこで仮引数の型や仮引数の数の違いにより区別します。仮引数の型や仮引数の数までも同じだと区別ができなくなるため、全ての組み合わせが同じメソッドを作成しようとするとエラーになります。
ではなぜオーバーロードなんて機能が必要なのでしょう?

郵便番号の登録をするとします。画面によっては郵便番号を(1)のように2つの入力ボックスで入力させる場合や、(2)のように1つの入力ボックスで入力させる場合があります。データベースなどに登録する前に入力した値が正しい形式であるかチェックする場合、(1)は引数が2つの checkZip2 というメソッドで、(2)は引数が1つの checkZip1 のメソッドであるとすると、クラスを使う人は引数が異なるごとに違うメソッドを使い分けなくてはいけなく面倒です。そこでオーバーライド機能によってメソッド名は checkZip で統一し、引数が違えば自動的に判断して処理を切り替えてくれれば、使う人は郵便番号をチェックするには checkZip メソッドを使えばいいと覚えるだけですみます。このようにオーバーロードを使いこなせばクラス使用者にとっては使いやすいクラスになります。
サンプル
【OverloadTest .java】
public class OverloadTest {
void overload(int x){ //(1)
System.out.println("(1) x=" + x);
}
void overload(int x , int y){ //(2)
System.out.println("(2) x=" + x + " y=" + y);
}
void overload(double x){ //(3)
System.out.println("(3) x=" + x);
}
}
このクラスには「overload」という名前のメソッドが3つあります。(1)と(2)は両方ともint型の仮引数をもちますが仮引数の数が違います。(1)と(3)は両方とも仮引数の数は1つですが仮引数の型が違います。このように「仮引数の型」と「仮引数の数」の組み合わせが異なるので同じ名前のメソッド名にすることができます。
【Sample.java】
public class Sample {
public static void main(String[] args) {
OverloadTest object = new OverloadTest();
object.overload(1); //(1)
object.overload(10 , 20); //(2)
object.overload(3.5); //(3)
}
}
(2) x=10 y=20
(3) x=3.5
4~6行目では同じ名前のメソッド名を呼び出していますが引数が違います。結果をみると引数から判断して対応するメソッドを実行していることがわかります。
注意点
public class OverloadTest {
void overload(int x){ //(1)
System.out.println("(1) x=" + x);
}
void overload(int y){ //(2)
System.out.println("(2) y=" + y);
}
}
Exception in thread "main" java.lang.Error: Unresolved compilation problems: 型 OverloadTest にメソッド overload(int) が重複しています 型 OverloadTest にメソッド overload(int) が重複しています
(1)と(2)は両方とも int型で仮引数の数は1つです。仮引数の名前が違うだけです。これは受け取った値を入れる箱の名前が違うだけで、これだけではint型の値を渡されたときにどちらのメソッドを使っていいの判断できません。区別できないので当然エラーになります。オーバーロードの判定に仮引数名は関係ないことに注意してください。
public class OverloadTest {
void overload(int x){ //(1)
System.out.println("(1) x=" + x);
}
int overload(int x){ //(2)
System.out.println("(2) x=" + x);
return x;
}
}
Exception in thread "main" java.lang.Error: Unresolved compilation problems: 型 OverloadTest にメソッド overload(int) が重複しています 型 OverloadTest にメソッド overload(int) が重複しています
(1)と(2)で返却値の型が違います。オーバーロードでのメソッドの区別判定は仮引数で行っていました。返却値の型はオーバーロードの区別判定には関係ありません。引数を渡されたときに、どのメソッドを使っていいのかわからなければエラーになります。
2010 年 5 月 31 日 月曜日 【 カテゴリー: Javaの基本 】
