この問題を通じてメソッドのオーバーロードと呼び出しについて理解を深めましょう。
問題
次のプログラムを実行した場合、出力はどれでしょうか?
class Printer {
void print(Object obj) {
System.out.println("Object: " + obj);
}
void print(String str) {
System.out.println("String: " + str);
}
}
public class Main {
public static void main(String[] args) {
Printer printer = new Printer();
printer.print("Hello");
printer.print(123);
}
}
選択肢
- A. String: Hello Object: 123
- B. Object: Hello Object: 123
- C. String: Hello String: 123
- D. コンパイルエラー
答えと解説
回答を見る
答え
A. String: Hello Object: 123
解説
今回のポイントは、メソッドのオーバーロードとオブジェクトの実行時解決(ダイナミックディスパッチ)です。
- 基本説明:Javaでは、同一クラス内でのメソッドのオーバーロードは形状(引数リスト)に応じて異なります。大切なのは、メソッドを呼び出す際に、対象オブジェクトと引数の型によって適切なメソッドが選択されることです。
Printer
クラスのメソッドprint
はオーバーロードされており、print(Object obj)
とprint(String str)
があります。 - 誤答理由:多くの学習者は、オブジェクト型の
print(Object obj)
が常に呼ばれると誤解し、実行結果を「B. Object: Hello Object: 123」ととらえるかもしれません。しかし、実際には文字列型の場合には、特化したprint(String str)
が呼ばれます。 - つまずきポイント:オブジェクト型の
print(Object obj)
は多くのものに対応できるため、何が呼ばれるか不安に感じることがあります。特に異なる引数を持つメソッドをオーバーロードする際、具体的な型に合致したメソッドが優先されることを記憶すると良いでしょう。 - 発展知識:メソッドの選択はコンパイル時に行われるため、正しいオーバーロード理解はオブジェクト指向における多くの制約に対応する基盤となります。特に、処理速度を最適化する際にコンパイラーによる多義性の解消が重要です。