Java 15的密封类功能中的final类和非密封类有什么区别?

问题描述

我具有以下密封接口(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的行为是什么?

解决方法

  • Cat标记为final后,其他任何类都不能扩展Cat
  • Duck标记为non-sealed后,任何类都可以扩展Duck

在将类标记为sealed时,所有直接扩展的类(在permits子句之后的类)都必须标记为finalsealed或{{ 1}}:

  • 将扩展non-sealed类的类标记为sealed,对其具有相同的效果:仅允许在sealed子句之后指定的类对其进行扩展。 / p>

  • permits只是“打破了封印”,因此效果不必在层次结构中进行。扩展类是开放的(再次),可以由未知子类本身扩展。

  • non-sealedfinal有效,与sealed相同,但没有在permits子句之后指定任何类。请注意,在permits之后不能指定任何内容,因此sealed无法替换final