Java 15 的密封类特性中的最终类和非密封类有什么区别?

mke*_*erz 7 java sealed-class java-15 java-sealed-type

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

public sealed interface Animal permits Cat, Duck {

    String makeSound();
}
Run Code Online (Sandbox Code Playgroud)

该接口由 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";
    }
}
Run Code Online (Sandbox Code Playgroud)

谁能告诉我之间的差异finalnon-sealedfinal阻止我创建其他子类,但什么行为non-sealed适用于Duck

aku*_*ykh 10

  • 正如您已标记Catfinal,没有其他类可以扩展Cat
  • 正如您已标记Ducknon-sealed,任何类都可以扩展Duck

当标记一个类为sealed,所有直接扩展类(后的那些permits子句)必须被无论是作为标记finalsealednon-sealed

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

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

  • final有效的一样sealed没有经过指定的任何类的permits条款。请注意,permits不可能在之后指定任何内容,因此sealed不能替换final