
問題
次のコードをコンパイル、実行するとどうなりますか。
public class Main {
public static void main(String[] args) {
A[] list = new A[3];
list[0] = new A();
list[1] = new B();
list[2] = new C();
for(A obj : list) {
obj.print();
}
}
}
class A {
public void print() {
System.out.print("A");
}
}
class B extends A {
public void print() {
System.out.print("B");
}
}
class C extends A {
public void print() {
System.out.print("C");
}
}
選択肢
A)Aが出力されたあと、ClassCastException がスローされる
B)何も出力されず、ClassCastException がスローされる
C)コンパイルエラーになる
D)ABC が出力されたあと、ArrayIndexOutOfBoundsException がスローされる
E)ABC が出力される
F)AAA が出力される
解答
A)Aが出力されたあと、ClassCastException がスローされる
B)何も出力されず、ClassCastException がスローされる
C)コンパイルエラーになる
D)ABC が出力されたあと、ArrayIndexOutOfBoundsException がスローされる
E)ABC が出力される
F)AAA が出力される
解答
このコードをコンパイル、実行すると、E)ABC が出力される という結果になります。
- 配列の作成:javaコードをコピーする
A[] list = new A[3];Aクラスのインスタンスを格納できる配列listを作成します。 - オブジェクトの格納:javaコードをコピーする
list[0] = new A(); // Aのインスタンス list[1] = new B(); // Bのインスタンス(Aを継承) list[2] = new C(); // Cのインスタンス(Aを継承)list[0]にはAのインスタンスが格納されます。list[1]にはBのインスタンスが格納されます。list[2]にはCのインスタンスが格納されます。
- ループ処理:javaコードをコピーする
for(A obj : list) { obj.print(); }このループはlistの各要素に対してprint()メソッドを呼び出します。ここでの重要な点は、print()メソッドがオーバーライドされているため、実行時に実際のオブジェクトの型に応じたメソッドが呼ばれます。list[0]の場合、Aのprint()メソッドが呼び出され、"A"が出力されます。list[1]の場合、Bのprint()メソッドが呼び出され、"B"が出力されます。list[2]の場合、Cのprint()メソッドが呼び出され、"C"が出力されます。
結論
最終的に出力されるのは ABC ですので、正しい選択肢は E)ABC が出力される です。
対象資格:Java SE17 認定資格
