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

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

問題

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

public class Main {
	public static void main(String... args) {
		MyType t = new Base();
		AbstractBase a = (AbstractBase) t;
		Base b = (Base) t;
		t.method();
		a.method();
		b.method();
	}
}

interface MyType {
	default void method() {
		System.out.print("MyType::method ");
	}
}

abstract sealed class AbstractBase implements MyType {
	private void method() {
		System.out.print("AbstractBase::method ");
	}
}

final class Base extends AbstractBase {
	public void method() {
		System.out.print("Base::method ");
	}
}

選択肢

A)Base::method MyType::method Base::method が出力される

B)ClassCastException がスローされる

C)Base::method Base::method Base::method が出力される

D)Base::method AbstractBase::method Base::method が出力される

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

F)MyType::method AbstractBase::method Base::method が出力される

解答

A)Base::method MyType::method Base::method が出力される

B)ClassCastException がスローされる

C)Base::method Base::method Base::method が出力される

D)Base::method AbstractBase::method Base::method が出力される

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

F)MyType::method AbstractBase::method Base::method が出力される

解説

このコードを実行すると、出力は C)Base::method Base::method Base::method になります。

  1. クラスの関係:
    • MyType インターフェースにはデフォルトメソッド method() が定義されています。
    • AbstractBaseMyType を実装しているが、method() メソッドは private です。つまり、AbstractBase の外からはこのメソッドにはアクセスできません。
    • Base クラスは AbstractBase を拡張し、method() をオーバーライドしています。
  2. main メソッド内の処理:
    • MyType t = new Base(); により、tBase のインスタンスを指します。
    • AbstractBase a = (AbstractBase) t; および Base b = (Base) t; はキャストであり、問題なく動作します。
    • t.method(); を呼び出すと、Basemethod() が呼ばれ、Base::method が出力されます。
    • a.method();Basemethod() を呼び出し、同様に Base::method が出力されます。
    • b.method(); も再び Basemethod() が呼び出され、同じく Base::method が出力されます。

前の問題へ SE17_B-19

次の問題へ SE17_B-21

対象資格:Java SE17 認定資格