首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java 15的密封类特性中,最终类和非密封类之间有什么区别?

在Java 15的密封类特性中,最终类和非密封类之间有什么区别?
EN

Stack Overflow用户
提问于 2020-09-19 18:34:08
回答 2查看 1.3K关注 0票数 11

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

代码语言:javascript
复制
public sealed interface Animal permits Cat, Duck {

    String makeSound();
}

这个接口由两个类实现:

代码语言:javascript
复制
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的行为是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-19 18:40:37

  • 由于您已经将Cat标记为final,没有其他类可以扩展Cat
  • 当您将Duck标记为non-sealed时,任何类都可以扩展Duck

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

  • 将扩展sealed类的类标记为sealed,对其应用同样的效果:只有在permits子句之后指定的类才允许对其进行扩展。
  • non-sealed只是“打破了封印”,所以这种效果不必在层次结构中继续下去。扩展类是打开的(再次),用于由未知子类本身扩展。
  • final实际上与sealed相同,没有在permits子句之后指定任何类。请注意,不可能在permits之后指定任何内容,因此sealed无法替换final
票数 14
EN

Stack Overflow用户

发布于 2021-10-27 15:49:36

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

当您将类标记为密封时,只有允许的子类才能扩展它,并且只能使用这些修饰符--最终、密封或非密封:

代码语言:javascript
复制
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根级层次结构对已知的类集是封闭的,但是您可以使用非密封关键字允许打开子层次结构。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63972130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档