問題
次のクラスのサブクラスを正しく宣言しているものはどれですか。(2つ選択)
public sealed class Shape permits Square, Triangle { }
選択肢
A)
public abstract class Triangle extends Shape { }
B)
public final class Circle extends Shape { }
C)
public final class Square extends Shape { }
D)
public non-sealed class Rectangle extends Shape {}
E)
public class Square extends Shape { }
F)
public non-sealed class Triangle extends Shape { }
G)
public class Triangle extends Shape { }
解答
A)
public abstract class Triangle extends Shape { }
B)
public final class Circle extends Shape { }
C)
public final class Square extends Shape { }
D)
public non-sealed class Rectangle extends Shape {}
E)
public class Square extends Shape { }
F)
public non-sealed class Triangle extends Shape { }
G)
public class Triangle extends Shape { }
解説
Shape
クラスは sealed
クラスであり、permits
キーワードによって許可されているサブクラスを Square
と Triangle
と指定しています。このため、正しいサブクラスの宣言は以下の条件を満たす必要があります:
Square
とTriangle
はShape
を継承していること。Square
とTriangle
の定義はsealed
クラスの制約に従う必要がある。
選択肢別:
- C)public final class Square extends Shape;
→Square
はfinal
クラスであり、Shape
を正しく継承しています。 - F)public non-sealed class Triangle extends Shape;
→Triangle
はnon-sealed
クラスとして宣言されており、Shape
を正しく継承しています。
A)public abstract class Triangle extends Shape;
→ Triangle
は sealed
クラスのサブクラスとしては許可されていません。sealed
クラスは、permits
で指定されたクラス名と一致する必要があります。
B)public final class Circle extends Shape;
→ Circle
は Shape
のサブクラスとして宣言されていますが、Shape
クラスでは Circle
は permits
に含まれていないため、コンパイルエラーになります。
D)public non-sealed class Rectangle extends Shape {};
→ Rectangle
は Shape
のサブクラスとして許可されていないため、コンパイルエラーになります。
E)public class Square extends Shape;
→ Square
はサブクラスとして適切ですが、sealed
クラスの規則に従って final
または non-sealed
として指定する必要があります(ここでは指定がないため、適切とは言えません)。
G)public class Triangle extends Shape;
→ Triangle
は Shape
のサブクラスとして正しい宣言ですが、sealed
クラスの制約に従って final
または non-sealed
として宣言する必要があります(ここでも指定がないため、適切ではありません)。
対象資格:Java SE17 認定資格