本日はJavaのオブジェクト指向に関する問題を解いてみましょう。
問題
次のプログラムを実行した場合の出力はどれでしょうか?正しい選択肢を選んでください。
class Printer {
void print(String str) {
System.out.println(str);
}
void print(Object obj) {
System.out.println("Object: " + obj);
}
}
public class Main {
public static void main(String[] args) {
Printer printer = new Printer();
String text = "Hello, World!";
Object textObj = text;
printer.print(text);
printer.print(textObj);
}
}
選択肢
- A. Hello, World! Object: Hello, World!
- B. Object: Hello, World! Hello, World!
- C. Hello, World! Hello, World!
- D. Object: Hello, World! Object: Hello, World!
答えと解説
回答を見る
答え
C. Hello, World! Hello, World!
解説
解説のポイント:
- メソッドオーバーロードのルール
- 型の優先順位とメソッド解決
Javaのメソッドオーバーロードでは、コンパイル時に実引数の型に最も合致するメソッドが解決されます。
printer.print(text)
では、String
型の引数が渡されているため、void print(String str)
メソッドが選ばれます。
一方、printer.print(textObj)
はObject
型の引数が渡されるため、void print(Object obj)
メソッドが選ばれるように思えますが、実際にはtextObj
もString
型を指しているため、明示的にprint(Object obj)
メソッドが呼ばれるケースを除き、print(String str)
が選択されます。
見通しを明確にするために、明示的にObjectを使用しているわけではないため、両方の呼び出しにおいてvoid print(String str)
が選ばれる結果、「Hello, World!」が両方表示されます。