在 Java 17 中,sealed 类(密封类)就像是 🏛️ 皇位继承制度 ,它明确规定:哪些类可以继承自己,不允许“外人”随意篡位!
用 sealed 修饰的类,必须通过 permits 指定谁能继承它。继承者只能是 final(断绝后代)、sealed(继续指定继承人)或 non-sealed(开放继承,等于不用sealed修饰,但是不能省略)。
让我们用八卦来清晰的了解一下这个修饰符的作用,想象清朝皇位传承:
sealed class 清朝皇帝 → 只允许 permits 康熙, 雍正, 乾隆。康熙、雍正、乾隆都是 皇阿玛或者老祖宗亲自指定的 → 正统皇帝。袁世凯 想复辟称帝?❌ 编译直接报错!因为他不在 permits 名单里,无法继承“清朝皇帝”这个类。non-sealed不再世袭罔替permits 就知道有哪些子类。switch 检查密封子类时,编译器能智能判断是否覆盖所有情况。修饰符 | 含义说明 |
|---|---|
final | 表示该子类不能再被继承(终结继承链,光绪->宣统(不是亲儿子) |
sealed | 表示该子类仍可被限定继承,需继续声明 permits |
non-sealed | 表示该子类不再限制继承,任何类都可继承它,等价于不使用sealed,因为语法限制,不可省略 |
密封类就是 “正大光明匾后面的皇位继承名单” 🏮,既保证了血统纯正,又防止了“袁世凯式”的意外篡位,让代码架构更清晰、更安全!
// 父类、接口定义
public sealed interface KingInterface permits GuangxuClass, YongzhengClass {
//登基
void release();
//谥号
void dead();
}
//子类实现 限制继承子类
public sealed class YongzhengClass implements KingInterface permits QianlongClass {
@Override
public void release() {
System.out.println("Yongzheng release");
}
@Override
public void dead() {
System.out.println("Yongzheng dead");
}
}
//子类实现 不限制继承
public non-sealed class GuangxuClass implements KingInterface {
@Override
public void release() {
System.out.println("Yongzheng release");
}
@Override
public void dead() {
System.out.println("Yongzheng dead");
}
}
//袁世凯.......的机会来了
public class YuanshikaiClass extends GuangxuClass{
//登基
@Override
public void release() {
System.out.println(" Yuanshikai 复辟了");
}
//谥号
@Override
public void dead() {
System.out.println(" Yuanshikai 薨了");
}
}原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。