【JDK15 新特性】密封类

2023-03-09 09:08:46 浏览数 (1)

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表示子类不是一个密封类,可以被任何类继承

0 人点赞