【Java SE17 Silver 模擬試験】B-51

Java SE17 Silver 模擬試験
Java SE17 Silver 模擬試験

問題

次のコードをコンパイル、実行するとどうなりますか。

public class Main {
	public static void main(String... args) {
		Base b = new Sub();
		b.method();
	}
}

sealed class Base {
	public void method() {
		System.out.println("Base: ");
	}
}

final class Sub extends Base {
	private void print() {
		System.out.print("Sub: ");
	}

	public void method() {
		print();
	}
}

選択肢

A)コンパイルエラーになる

B)ClassCastException がスローされる

C)Sub: が出力される

D)Base: Sub: が出力される

E)Sub: Base: が出力される

F)Base: が出力される

解答

A)コンパイルエラーになる

B)ClassCastException がスローされる

C)Sub: が出力される

D)Base: Sub: が出力される

E)Sub: Base: が出力される

F)Base: が出力される

解説

このコードを分析すると、次のようになります。

コードの流れ

1. メインメソッド

public static void main(String... args) {
    Base b = new Sub();
    b.method();
}

Base 型の変数 bSub クラスのインスタンスが代入されます。b.method(); が呼ばれると、Base クラスの method メソッドが呼ばれると思われがちですが、実際にはポリモーフィズムにより、Sub クラスの method メソッドが呼ばれます。

2. Baseクラス

sealed class Base {
    public void method() {
        System.out.println("Base: ");
    }
}

Base クラスには method メソッドがありますが、Sub クラスがこのメソッドをオーバーライドしています。

3. Subクラス

final class Sub extends Base {
    private void print() {
        System.out.print("Sub: ");
    }

    public void method() {
        print();
    }
}

Sub クラスは Base を継承しており、method メソッドをオーバーライドしています。このメソッド内で print メソッドを呼び出し、”Sub: ” を出力します。print メソッドは private ですが、method メソッド内から呼び出せるため、問題ありません。

実行結果

  • メインメソッドの b.method(); が呼ばれると、Sub クラスの method メソッドが実行され、print(); が呼ばれます。
  • print メソッドによって “Sub: ” が出力されます。

まとめ

  • 出力: “Sub: “
  • 選択肢の確認:
    • A)コンパイルエラーになる → 不正解
    • B)ClassCastException がスローされる → 不正解
    • C)Sub: が出力される → 正解
    • D)Base: Sub: が出力される → 不正解
    • E)Sub: Base: が出力される → 不正解
    • F)Base: が出力される → 不正解

最終的に、選択肢 C が正しい結果です。

前の問題へ SE17_B-50

次の問題へ SE17_B-52

対象資格:Java SE17 認定資格