java密封类通过sealed+permits两级控制实现可预测、可验证的继承限制,要求子类明确声明final/sealed/non-sealed,支持编译期穷尽性检查。

Java 密封类通过 显式声明允许的子类 + 强制子类修饰符 两级控制,实现对继承权限的精确限制。它不是简单“禁止继承”,而是让继承关系可预测、可验证、可维护。
用 sealed + permits 锁定直接子类范围
密封类必须用 sealed 修饰,并通过 permits 明确列出所有**直接允许继承它的类**。编译器会强制检查:不在列表中的类无法继承,列表中缺失的子类会导致编译错误。
- permits 后必须写全类名(如
permits com.example.Circle, com.example.Rectangle),若同包可省略包名 - permits 列表不能为空;即使只有一个子类,也必须写出
- 所有被许可的子类必须与密封类在同一个模块(或默认模块下同一包)
每个子类必须用 final / sealed / non-sealed 明确表态
被 permits 允许的子类不能“默认继承”,必须主动选择自己的继承策略:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- final:彻底终止继承链,该类不可再被任何类扩展
-
sealed:自身也成为密封类,需配合自己的
permits继续限定下一级子类 - non-sealed:开放继承,任何类都可继承它(但前提是它本身已被父类明确允许)
密封接口同样适用这套规则
接口也可声明为 public sealed interface Shape permits Circle, Rectangle。实现类(Circle、Rectangle)同样必须用 final、sealed 或 non-sealed 修饰。这能防止任意类随意实现关键业务接口,比如支付渠道、消息类型等。
实际效果不只是“限制”,更是“可穷尽”
因为所有合法子类都被编译器已知,Java 的 switch 表达式可对密封类做模式匹配,并在编译期检查是否覆盖全部情况:
- 例如
switch (shape) { case Circle c -> ...; case Rectangle r -> ...; } - 如果后来新增了
Triangle但没加到permits或 switch 分支,编译直接报错 - 这种“穷尽性检查”是传统继承做不到的安全保障
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










