【问题标题】:What is the difference between a final and a non-sealed class in Java 15's sealed-classes feature?Java 15 的密封类功能中的最终类和非密封类有什么区别?
【发布时间】:2021-01-06 08:37:51
【问题描述】:

我有以下密封接口(Java 15):

public sealed interface Animal permits Cat, Duck {

    String makeSound();
}

这个接口由2个类实现:

public final class Cat implements Animal {

    @Override
    public String makeSound() {
        return "miau";
    }
}

public non-sealed class Duck implements Animal {

    @Override
    public String makeSound() {
        return "quack";
    }
}

谁能告诉我finalnon-sealed 之间的区别? final 阻止我创建其他子类,但 non-sealed 适用于 Duck 的行为是什么?

【问题讨论】:

标签: java sealed-class java-15 java-sealed-type


【解决方案1】:
  • 由于您已将 Cat 标记为 final,因此没有其他类可以扩展 Cat
  • 由于您已将 Duck 标记为 non-sealed,因此任何类都可以扩展 Duck

将类标记为sealed 时,所有直接扩展类(permits 子句之后的类)必须标记为finalsealednon-sealed

  • 将扩展sealed 类的类标记为sealed,对其应用相同的效果:仅允许在permits 子句之后指定的类对其进行扩展。

  • non-sealed 只是“打破封印”,所以效果不必沿层次传递。扩展类(再次)是开放的,可以被未知的子类本身扩展。

  • final实际上sealed 相同,在permits 子句之后没有指定任何类。请注意,在permits 之后不能指定任何内容,因此sealed 不能替换final

【讨论】:

  • 谢谢,现在很清楚了。每个类都可以从“非密封”类扩展:)
【解决方案2】:

最终类有零个子类,这意味着没有其他类可以扩展它。 任何类都可以扩展非密封类。

当您将一个类标记为密封时,只有允许的子类可以扩展它,并且只能有这些修饰符 final、sealed 或 non-sealed:

public sealed class NumberSystem
    // The permits clause has been omitted
    // as all the subclasses exists in the same file.
{ }
non-sealed class Decimal extends NumberSystem { .. }
final class NonRecurringDecimal extends Decimal {..}
final class RecurringDecimal extends Decimal {..}

虽然 NumberSystem 根级层次结构对一组已知类是封闭的,但您可以使用 non-sealed 关键字允许打开子层次结构。

密封和非密封组合允许您限制部分层次结构,但不是全部。

在下图中,我们将密封类 NumberSystem 的根层次结构限制为一组已知的子类。但是,non-sealed Decimal 类允许任何未知的子类(例如 RecurringDecimal)对其进行扩展。

【讨论】:

    猜你喜欢
    • 2021-01-11
    • 2021-11-05
    • 2017-11-28
    • 2021-11-12
    • 2016-03-29
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多