メソッドのオーバーロードに関する問題に挑戦しましょう。複数のメソッド定義について理解を深めることが目的です。
問題
以下のプログラムを実行した場合の出力はどれでしょうか?適切な選択肢を選んでください。
class Printer {
void print(int number) {
System.out.println("Integer: " + number);
}
void print(double number) {
System.out.println("Double: " + number);
}
void print(String message) {
System.out.println("String: " + message);
}
}
public class Main {
public static void main(String[] args) {
Printer printer = new Printer();
printer.print(10);
printer.print(10.5);
printer.print("Hello");
}
}
選択肢
- A. Integer: 10 Double: 10.5 String: Hello
- B. Integer: 10 Integer: 10 String: Hello
- C. コンパイルエラー
- D. 実行時エラー
答えと解説
回答を見る
答え
A. Integer: 10 Double: 10.5 String: Hello
解説
基本説明:
このプログラムは複数のメソッドをオーバーロードしている例です。オーバーロードとは、同じメソッド名で異なる引数リストを持つ複数のメソッドを定義することです。
各メソッドは、引数の型違いで定義されているため、呼び出される際に適切なメソッドが選ばれます。Javaでは、引数の型や数に基づいて最適なメソッドが選択され実行されます。
誤答理由:
選択肢Bを選ぶと間違いです。この選択肢では、2番目の呼び出しが「Integer: 10」になると示唆されています。これは、10.5がdouble型であるため、doubleを引数に持つメソッドが選ばれることによります。
選択肢C、Dは正しくない理由はコンパイルエラーも実行時エラーもこのコードの範囲では発生しないからです。
つまずきポイント:
初心者が混乱しやすいポイントの1つは、整数リテラルや小数点以下の値が指定されたときに、どの型のメソッドが呼び出されるかです。
Javaでは、整数リテラルはintとして、小数点以下があるリテラルはdoubleとして解釈されます。
発展知識:
Java オーバーロードの有用性は、同様の操作を異なるデータ型に対して一貫したインターフェイスで提供できることです。
例えば、他の言語では独自のメソッドを形ごとに書く必要がありますが、Javaでは1つのメソッド名を変えずに異なるタイプのデータを処理できます。