我有下面的密封接口(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";
}
}
有人能告诉我final
和non-sealed
之间的区别吗?final
阻止我创建其他子类,但non-sealed
适用于Duck
的行为是什么?
3条答案
按热度按时间idfiyjo81#
Cat
标记为final
,所以没有其他类可以扩展Cat
。Duck
标记为non-sealed
,所以任何类都可以扩展Duck
。当将一个类标记为
sealed
时,所有直接扩展的类(permits
子句之后的类)必须标记为final
、sealed
或non-sealed
:sealed
类的类标记为sealed
,会对其应用相同的效果:只有在permits
子句之后指定的类才允许扩展该子句。non-sealed
只是“打破了封印”,所以效果不必沿着层次结构向下传递。扩展类(再次)是开放的,可以被未知的子类本身扩展。final
实际上与sealed
相同,但在permits
子句之后没有指定任何类。请注意,不可能在permits
之后不指定任何内容,因此sealed
不能替换final
。72qzrwbm2#
例如:
此密封接口只允许用于Cat & Duck类。请注意,Cat & Duck必须是final、非密封或密封类
现在,我正在创建猫和鸭类。这里猫是最后一个类,另一个是非密封类。
zsbz8rwp3#
final类没有子类,这意味着没有其他类可以扩展它。任何类都可以扩展非密封类。
将类标记为密封时,只有允许的子类才能扩展该类,并且只能具有final、sealed或nonsealed修饰符:
尽管NumberSystem根层次结构对已知类集是关闭的,但您可以使用non-sealed关键字来打开子层次结构。
密封和非密封组合允许您限制层次结构的一部分,但不是全部。
在下图中,我们将密封类NumberSystem的根层次结构限制为一组已知的子类。但是,non-sealed Decimal类允许任何未知子类(如RecurringDecimal)对其进行扩展。