default
方法。它们被引入有两个主要原因(可能还有其他原因):
- 提供实际的默认实现。例如:
Iterator.remove()
- 允许 JDK API 进化。例如:
Iterable.forEach()
final
。这在添加便利方法并防止实现类中的“意外”覆盖时非常有用:interface Sender {
// Convenience method to send an empty message
default final void send() {
send(null);
}
// Implementations should only implement this method
void send(String message);
}
上述做法已经是常见的实践,如果
Sender
是一个类的话:abstract class Sender {
// Convenience method to send an empty message
final void send() {
send(null);
}
// Implementations should only implement this method
abstract void send(String message);
}
现在,“default”和“final”显然是矛盾的关键字,但默认关键字本身不是必需的,所以我认为这种矛盾是有意的,以反映“具有主体的类方法”(仅为方法)和“具有主体的接口方法”(默认方法)之间的微妙差异,即我尚未理解的差异。
在某个时刻,像“static”和“final”这样的修饰符在接口方法上的支持还没有得到充分的探索,引用Brian Goetz的话:
引述:
另一个问题是我们将在接口中为类构建工具提供的支持,例如final方法、private方法、protected方法、static方法等等。答案是:我们还不知道。
自2011年末以来,显然,在接口中支持static
方法。很明显,这为JDK库本身增加了很多价值,例如Comparator.comparing()
。
问题:
final
(以及static final
)为什么没有出现在Java 8接口中?
final
可以防止方法被覆盖,但由于必须重写从接口继承的方法,因此我不明白为什么将其设为final
。除非它是用来表示在重写一次后方法是最终版本的。如果我的理解不正确,请告诉我。这似乎很有趣。 - Dioxinfinal
可以防止实现类覆盖接口方法的默认实现。 - awksp