1. 背景
在 Java 中如果想让一个类不能被继承和修改,这时我们应该使用 final 关键字对类进行修饰。不过这种要么可以继承,要么不能继承的机制不够灵活,有些时候我们可能想让某个类可以被某些类型继承,但是又不能随意继承,是做不到的。Java 15 尝试解决这个问题,引入了 sealed 类,被 sealed 修饰的类可以指定子类。这样这个类就只能被指定的类继承。
2. 新特性
通过密封的类和接口来限制超类的使用,密封的类和接口限制其它可能继承或实现它们的其它类或接口。
具体使用:
- 使用修饰符sealed,可以将一个类声明为密封类。密封的类使用保留关键字permits列出可以直接扩展(即extends)它的类。
- sealed 修饰的类的机制具有传递性,它的子类必须使用指定的关键字进行修饰,且只能是 final、sealed、non-sealed 三者之一。
- final:子类为finall,间接表示父类不能被其他类继承
- sealed:子类也可以声明为密封类
- non-sealed:声明为非密封类,可以被其他类继承
举例:
代码语言:javascript复制public abstract sealed class Shape permits Circle, Rectangle, Square {...}//密封类
public final class Circle extends Shape {...} //final表示子类不能再被继承了,间接表示父类值能被指定类继承
public sealed class Rectangle extends Shape permits TransparentRectangle, FilledRectangle {...}//子类也是一个密封类
public non-sealed class Square extends Shape {...} //non-sealed表示子类不是一个密封类,可以被任何类继承