Java 密封类:受限的类层次结构
理解密封类如何精确控制哪些类或接口可以继承或实现它,增强领域建模的安全性。 · 难度:入门 · +15XP
为什么需要密封类?
在大型系统中,不受限制的继承可能导致类层次混乱。密封类(Java 17 正式版)允许你声明一个类只能被指定的子类扩展,从而保证模式匹配的穷举性。
基本语法
public sealed class Shape permits Circle, Rectangle, Triangle {
}
final class Circle extends Shape {}
final class Rectangle extends Shape {}
non-sealed class Triangle extends Shape {}
子类必须使用 final、sealed 或 non-sealed 修饰符。permits 列表中的类必须与密封类在同一模块或包中(Java 17 放宽了限制)。
在 switch 中使用
double area = switch (shape) {
case Circle c -> Math.PI * c.radius() * c.radius();
case Rectangle r -> r.width() * r.height();
case Triangle t -> 0.5 * t.base() * t.height();
};由于 Shape 是密封的,编译器知道所有子类型,无需 default 分支。
密封接口
public sealed interface Vehicle permits Car, Bike {
void drive();
}
final class Car implements Vehicle { ... }
final class Bike implements Vehicle { ... }
练习提示
在 starter_code 中,定义一个密封类 Animal,允许 Cat 和 Dog 两个子类,并在 main 中创建实例。