問題
次のコードをコンパイル、実行するとどうなりますか。
public class Main {
public static void main(String... args) {
Object[] objects = { new Base(), new Sub(), "Other: " };
for (Object obj : objects) {
if (obj instanceof Base o)
o.method();
}
}
}
class Base {
public void method() {
System.out.print("Base: ");
}
}
class Sub extends Base {
private void print() {
System.out.print("Sub: ");
}
public void method() {
print();
}
}
選択肢
A)何も出力されない
B)コンパイルエラーになる
C)Other: が出力される
D)Sub: が出力される
E)Base: Sub: Other: が出力される
F)ClassCastException がスローされる
G)Base: Sub: が出力される
解答
A)何も出力されない
B)コンパイルエラーになる
C)Other: が出力される
D)Sub: が出力される
E)Base: Sub: Other: が出力される
F)ClassCastException がスローされる
G)Base: Sub: が出力される
解説
コードの解析
1. ブジェクト配列の定義
Object[] objects = { new Base(), new Sub(), "Other: " };
Base
クラスのインスタンス、Sub
クラスのインスタンス、文字列 "Other: "
の3つのオブジェクトを含む配列が作成されます。
2. for-eachループ
for (Object obj : objects) {
if (obj instanceof Base o)
o.method();
}
各オブジェクトに対して instanceof
演算子を使い、Base
クラスまたはそのサブクラスのインスタンスかどうかを確認します。
3. オブジェクトのタイプとメソッドの呼び出し
1つ目のオブジェクト (new Base()
):
instanceof
によってBase
のインスタンスと判断され、o.method()
が呼ばれます。method()
が呼ばれ、"Base: "
と出力されます。
2つ目のオブジェクト (new Sub()
):
- 同様に
instanceof
によってBase
のインスタンスと判断され、o.method()
が呼ばれます。 Sub
クラスのmethod()
が呼ばれ、print()
メソッドが呼ばれて"Sub: "
と出力されます。
3つ目のオブジェクト ("Other: "
):
instanceof
によってBase
のインスタンスではないため、何も出力されません
対象資格:Java SE17 認定資格