
問題
次のコードがコンパイルエラーになる理由として正しいものはどれですか。
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 認定資格
