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
中的类,都必须用以下三种修饰符之一声明,不可省略:
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
立即学习
“
Java免费学习笔记(深入)
”;
final class X extends A
→ 不可再被继承
sealed class X extends A permits Y, Z
→ X 自身也是密封的,继续限制其子类
non-sealed class X extends A
→ 开放继承,任何类都可继承 X
常见合法示例结构
例如描述形状的封闭类型体系:
注意:接口也可密封(自 Java 17 起),规则与类一致;permits 列表写实现类,各实现类同样需标注 final/sealed/non-sealed。
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 { ... }