問題
次のコードがコンパイルエラーになる理由として正しいものはどれですか。
abstract class Base {
private int num;
Base(int num) {
this.num = num;
}
void method() {
System.out.println("Base::method");
}
}
final class Sub extends Base{
public void method() {
System.out.println("Sub::method");
}
}
選択肢
A)Sub クラスには引数なしのコンストラクタを明示的に定義する必要がある
B)Base クラスの変数 num のアクセス修飾子は public を指定する必要がある
C)Sub クラスの直接のスーパークラスは具象クラスである必要がある
D)メソッド method には Base クラスと Sub クラスで同じアクセス修飾子を指定する必要がある
E)Super クラスには引数なしのコンストラクタを明示的に定義す必要がある
解答
A)Sub クラスには引数なしのコンストラクタを明示的に定義する必要がある
B)Base クラスの変数 num のアクセス修飾子は public を指定する必要がある
C)Sub クラスの直接のスーパークラスは具象クラスである必要がある
D)メソッド method には Base クラスと Sub クラスで同じアクセス修飾子を指定する必要がある
E)Super クラスには引数なしのコンストラクタを明示的に定義す必要がある
解説
このコードがコンパイルエラーになる理由について考えてみましょう。
コードの概要
Base
クラスはabstract
で、引数を取るコンストラクタを持っていますが、引数なしのコンストラクタは定義されていません。Sub
クラスはBase
クラスを継承していますが、引数なしのコンストラクタを明示的に定義していません。
各選択肢の評価
A)Sub クラスには引数なしのコンストラクタを明示的に定義する必要がある
- 正しい。
Base
クラスのコンストラクタには引数が必要なので、Sub
クラスはsuper(num)
の形で呼び出さなければなりません。引数なしのコンストラクタがないと、コンパイルエラーになります。
B)Base クラスの変数 num のアクセス修飾子は public を指定する必要がある
- 不正確。
private
で問題はありません。Base
クラスの変数num
にアクセスできないだけで、コンパイルエラーの原因にはなりません。
C)Sub クラスの直接のスーパークラスは具象クラスである必要がある
- 不正確。
Sub
はBase
という抽象クラスを継承していますが、特に具象クラスである必要はありません。
D)メソッド method には Base クラスと Sub クラスで同じアクセス修飾子を指定する必要がある
- 不正確。
Sub
クラスでmethod
メソッドのアクセス修飾子を変更することは可能です。
E)Super クラスには引数なしのコンストラクタを明示的に定義する必要がある
- 不正確。
Base
クラスには引数なしのコンストラクタが必須ではありませんが、Sub
クラスがBase
クラスを適切に初期化するためには引数が必要です。
結論
したがって、正しい理由は A)Sub クラスには引数なしのコンストラクタを明示的に定義する必要がある です。
対象資格:Java SE17 認定資格