MENU

【Java Silver 試験】メソッドオーバーロードとオーバーライド【オブジェクト指向の理解】

本日は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)メソッドが選ばれるように思えますが、実際にはtextObjString型を指しているため、明示的にprint(Object obj)メソッドが呼ばれるケースを除き、print(String str)が選択されます。

見通しを明確にするために、明示的にObjectを使用しているわけではないため、両方の呼び出しにおいてvoid print(String str)が選ばれる結果、「Hello, World!」が両方表示されます。

目次