問題
次のコードをコンパイル、実行するとどうなりますか。
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 ");
}
}
対象資格:Java SE17 認定資格