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