我有以下密封接口(Java 15):
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";
}
}有人能告诉我final和non-sealed之间的区别吗?final阻止我创建其他子类,但是non-sealed应用于Duck的行为是什么?
发布于 2020-09-19 18:40:37
Cat标记为final,没有其他类可以扩展Cat。Duck标记为non-sealed时,任何类都可以扩展Duck。当将类标记为sealed时,所有直接扩展类( permits子句后面的类)都必须标记为final、sealed或non-sealed。
sealed类的类标记为sealed,对其应用同样的效果:只有在permits子句之后指定的类才允许对其进行扩展。non-sealed只是“打破了封印”,所以这种效果不必在层次结构中继续下去。扩展类是打开的(再次),用于由未知子类本身扩展。final实际上与sealed相同,没有在permits子句之后指定任何类。请注意,不可能在permits之后指定任何内容,因此sealed无法替换final。发布于 2021-10-27 15:49:36
最后一个类有零个子类,这意味着没有其他类可以扩展它。任何类都可以扩展非密封类。
当您将类标记为密封时,只有允许的子类才能扩展它,并且只能使用这些修饰符--最终、密封或非密封:
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 )对其进行扩展。
https://stackoverflow.com/questions/63972130
复制相似问题