在Java15的密封类特性中,final类和非密封类有什么区别?

txu3uszq  于 2023-01-11  发布在  Java
关注(0)|答案(3)|浏览(140)

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

idfiyjo8

idfiyjo81#

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

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

  • 将扩展sealed类的类标记为sealed,会对其应用相同的效果:只有在permits子句之后指定的类才允许扩展该子句。
  • non-sealed只是“打破了封印”,所以效果不必沿着层次结构向下传递。扩展类(再次)是开放的,可以被未知的子类本身扩展。
  • final实际上与sealed相同,但在permits子句之后没有指定任何类。请注意,不可能在permits之后不指定任何内容,因此sealed不能替换final
72qzrwbm

72qzrwbm2#

    • 最终类和非密封类存在一些差异。**
    • final class:**这个类不能继承,也就是说不能扩展到其他类。
    • 非密封类:**该类可以从别人那里继承。

例如:
此密封接口只允许用于Cat & Duck类。请注意,Cat & Duck必须是final、非密封或密封类

public sealed interface Animal permits Cat, Duck {
  String makeSound();
}

现在,我正在创建猫和鸭类。这里猫是最后一个类,另一个是非密封类。

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";
    }
}
    • 所以如果你可以尝试继承Cat类,你不能,得到编译错误,因为Cat类是final类,另一方面,Duck类是可扩展的,因为它是非密封类**比如,
//Got Error
public class MyCat extends Cat {

 .......
}

//Error not show.Duck class is extendable
public class MyDuck extends Duck {

    .....
}
zsbz8rwp

zsbz8rwp3#

final类没有子类,这意味着没有其他类可以扩展它。任何类都可以扩展非密封类。
将类标记为密封时,只有允许的子类才能扩展该类,并且只能具有final、sealed或nonsealed修饰符:

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)对其进行扩展。

相关问题