【Java SE17 Silver 模擬試験】A-39

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

問題

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

public class Main {
	public static void main(String... args) {
		A obj1 = new B();
		A obj2 = new C();
		obj2 = (A) obj1;      //lineA
		A obj3 = (C) obj2;   //lineB
		obj1.output();
		obj3.output();
	}
}

sealed class A permits B, C {
	public void output() {
		System.out.print("A ");
	}
}

final class B extends A {
	public void output() {
		System.out.print("B ");
	}
}

non-sealed class C extends A {
	public void output() {
		System.out.print("C ");
	}
}

選択肢

A)IineA で ClassCastException がスローされる

B)B C が出力される

C)IineB でコンパイルエラーになる

D)lineB で ClassCastException がスローされる

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

F)A A が出力される

G)A C が出力される

解答

A)IineA で ClassCastException がスローされる

B)B C が出力される

C)IineB でコンパイルエラーになる

D)lineB で ClassCastException がスローされる

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

F)A A が出力される

G)A C が出力される

解説

シールクラスでAクラスを定義し、BクラスとCクラスに継承を許可しています。
その後BクラスとCクラスにAクラスを継承しています。

public class Main {
	public static void main(String... args) {
		A obj1 = new B();            //B型でインスタンス化し、A型のobj1に代入 継承関係のため可能
		A obj2 = new C();            //C型でインスタンス化し、A型のobj2に代入 継承関係のため可能
		obj2 = (A) obj1;      //lineA         A型のobj1を(A)で明示的にキャストし、A型のobj2に代入
                                                  //なお、(A)と明示的にキャストしていますが、元々同じ型なので不要です
		A obj3 = (C) obj2;   //lineB       ClassCastException例外スロー
                                               //A型のobj2を(C)にキャストしていますが、C型にキャストできないためClassCastException例外スローされます
                                                  //なお、(C)を省くとClassCastExceptionの例外はスローされません
		obj1.output();
		obj3.output();
	}
}

sealed class A permits B, C {
	public void output() {
		System.out.print("A ");
	}
}

final class B extends A {
	public void output() {
		System.out.print("B ");
	}
}

non-sealed class C extends A {
	public void output() {
		System.out.print("C ");
	}
}

前の問題へ SE17_A-38

次の問題へ SE17_A-40


対象資格:Java SE17 認定資格