問題
次のうち、正しいクラスの定義はどれですか。
A)
final abstract class M { }
B)
abstract class M {
final void method() {
}
}
C)
class M {
abstract void method() {
}
}
D)
sealed class M permits X { }
abstract class X extends M { }
E)
abstract class M {
void method();
}
解答
A)
final abstract class M { }
B)
abstract class M {
final void method() {
}
}
C)
class M {
abstract void method() {
}
}
D)
sealed class M permits X { }
abstract class X extends M { }
E)
abstract class M {
void method();
}
解説
B)の説明:
abstract class M
は正しい形で抽象クラスを定義しており、その中にfinal
修飾子が付いたメソッドmethod
を持っています。これは有効です。抽象クラス内にfinal
メソッドがあることは可能です。
A) final abstract class M { }
- これは無効です。
final
クラスはサブクラスを持てないため、抽象クラスにすることはできません。
C) class M { abstract void method() { }
- これは無効です。非抽象クラス内に抽象メソッドを定義することはできません。
D) sealed class M permits X { }
で abstract class X extends M { }
- これは無効です。
sealed
クラスはpermits
を使ってサブクラスを制約しますが、X
は抽象クラスなので、正しくサブクラスとして機能しません。
E) abstract class M { void method(); }
- これは無効です。抽象クラスの中でメソッドの宣言をしている場合、メソッドの実装がないため、メソッドを抽象として宣言する必要がありますが、
abstract
修飾子が不足しています。正しくはabstract void method();
となるべきです。
対象資格:Java SE17 認定資格