問題
次のコードをコンパイル、実行するとどうなりますか。
public class Main {
public static void main (String... args) {
Parent p = new Child();
p.method();
}
}
class Parent {
int id;
Parent (int id) {
this.id = id;
}
void method() {
System.out.println("Parent : : method");
}
}
class Child extends Parent {
protected void method() {
System.out.println("Child : : method");
}
}
選択肢
A)何も出力されない
B)Parent : : method が出力される
C)ClassCastException がスローされる
D)コンパイルエラーになる
E)Child : : method が出力される
解答
A)何も出力されない
B)Parent : : method が出力される
C)ClassCastException がスローされる
D)コンパイルエラーになる
E)Child : : method が出力される
解説
Parent p = new Child(); により、Childクラスのコンストラクタが呼び出されます。
ここでの注意点は、ParentクラスとChildクラスは継承関係にあります。そのため、サブクラスのChildクラスのコンストラクタが呼び出される前に、暗黙的にsuper()が付与されスーパークラスであるParentクラスのコンストラクタが呼び出されます。
しかし、スーパークラスのParentクラスのコンストラクタには引数なしのコンストラクタが未定義のためコンパイルエラーが発生します。
A)何も出力されない
→ 誤り。コンパイルエラーが発生するため、何も出力されることはありません。
B)Parent : : method が出力される
→ 誤り。コンパイルエラーが発生するため、このメッセージも出力されません。
C)ClassCastException がスローされる
→ 誤り。実行時には ClassCastException
が発生しません。コンパイルエラーでプログラムが停止します。
D)コンパイルエラーになる
→ 正しい。Child
クラスが Parent
のコンストラクタを呼び出さないため、コンパイルエラーが発生します。
E)Child : : method が出力される
→ 誤り。コンパイルエラーが発生するため、このメッセージも出力されません。
したがって、正しい答えは D)コンパイルエラーになる で、他の選択肢はすべて誤りです。
対象資格:Java SE17 認定資格