java密封类自17版正式支持,用sealed关键字声明并配合permits限定直接子类,子类须为final/sealed/non-sealed之一,接口同样适用该机制。

Java 密封类(sealed class)用于限制哪些类可以继承它,从 Java 15 作为预览特性引入,到 Java 17 成为正式特性。它的核心语法是通过 sealed 关键字声明类,并用 permits 明确列出允许的直接子类。
基本定义语法
密封类必须满足三个条件:显式声明为 sealed、指定 permits 子类列表、每个被允许的直接子类必须用 final、sealed 或 non-sealed 之一明确标注其继承权限。
- 父类声明格式:sealed class A permits B, C, D
- 子类 B/C/D 必须在同一个模块(或同一包,若未使用模块系统)中定义
- 每个 permitted 子类必须以以下三者之一开头:final class、sealed class、non-sealed class
permits 列表要求
permits 后跟的是**直接子类名**,不是全限定名,且必须与密封类在同一个编译单元可访问范围内(通常为同一包;若在模块中,需确保包已导出且子类在模块内)。
- 不允许写接口、抽象类(除非它们确实是该密封类的直接子类)
- 不允许遗漏某个实际存在的直接子类,否则编译报错
- 不允许包含不存在的类名,或非直接子类(如孙子类)
子类必须显式声明继承权限
每个出现在 permits 中的类,都必须用以下三种修饰符之一声明,不可省略:
- final class X extends A → 不可再被继承
- sealed class X extends A permits Y, Z → X 自身也是密封的,继续限制其子类
- non-sealed class X extends A → 开放继承,任何类都可继承 X
常见合法示例结构
例如描述形状的封闭类型体系:
public sealed interface Shape permits Circle, Rectangle, Triangle {}
final class Circle implements Shape { ... }
sealed class Rectangle implements Shape permits Square {}
final class Square extends Rectangle { ... }
non-sealed class Triangle implements Shape { ... }
注意:接口也可密封(自 Java 17 起),规则与类一致;permits 列表写实现类,各实现类同样需标注 final/sealed/non-sealed。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











