
問題
次のクラスのサブクラスを正しく宣言しているものはどれですか。(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 認定資格
