今回はJavaのメソッドオーバーロードについての問題です。
問題
次のプログラムを実行した場合の出力はどれでしょうか?正しい選択肢を選んでください。
class OverloadExample {
void display(int a) {
System.out.println("Integer: " + a);
}
void display(String b) {
System.out.println("String: " + b);
}
void display(double a, double b) {
System.out.println("Double Sum: " + (a + b));
}
}
public class TestOverload {
public static void main(String[] args) {
OverloadExample obj = new OverloadExample();
obj.display(3, 4.5);
}
}
選択肢
- A. Integer: 3
- B. String: 3
- C. Double Sum: 7.5
- D. コンパイルエラー
答えと解説
回答を見る
答え
D. コンパイルエラー
解説
基本説明:
Javaではメソッドオーバーロードを用いることで、同じメソッド名で異なる引数の組み合わせを持つメソッドを定義できます。しかし、呼び出す際の引数の組み合わせが一致するメソッドが存在しなければコンパイルエラーとなります。このコードでは、引数がintとdoubleの組み合わせに一致するdisplayメソッドが定義されていないため、エラーとなります。
誤答理由:
選択肢A、B、Cはどれも正常に実行された場合の結果ですが、このプログラムの呼び出しに合致するメソッドが存在しないため、実はどの選択肢も該当しません。引数が異なる場合にはそれに対応するオーバーロードされたメソッドが必要です。
つまずきポイント:
初心者がよくつまずくのは、引数の型や数が異なる場合に適切なオーバーロードされたメソッドが存在しないことを見落とす点です。Javaは厳密に引数の型と数を確認するため、曖昧なマッチングは行われません。
発展知識:
オーバーロード時にもっとも狭い型、つまり特定的な型に一致するメソッドが優先して呼び出されます。 例えば、display(int)
とdisplay(double)
の両方があれば、intを渡すときはdisplay(int)
が呼び出されます。しかし、場合によっては自動型変換(autoboxingやwidening conversion)が適用されるため、注意が必要です。