概述
Java 8中的接口现在支持在声明方法的同时提供实现。
通过两种方式可以完成这种操作,其一,Java8允许在接口内声明静态方法;其二,Java8引入了一个新功能,叫默认方法,通过默认方法你可以指定方法的默认实现。
换句话说,接口能够提供方法的具体实现。因此,实现接口的类如果不显式地提供方法的具体实现,就会自动继承默认的实现。这种机制可以使你平滑地进行接口的优化和演进。
概述默认方法
默认方法是Java8中引入的新特性,希望能借此以兼容的方式改进API。
默认方法由default修饰符修饰,并像类中声明其他方法一样包含方法体。
public interface Sized {
int size();
default boolean isEmpty() {
return size() == 0;
}
}
这样任何一个实现了 Sized 接口的类都会自动继承 isEmpty 的实现。因此,向提供了默认实
现的接口添加方法就不是源码?容的。
解决冲突
解决问题的三条规则
如果一个类使用相同的函数签名从多个地方(比如另一个类或接口)继承了方法,通过三条
规则可以进行?断。
(1) 类中的方法优先级最高。类或?类中声明的方法的优先级高于任何声明为默认方法的优
先级。
(2) 如果无法依据第一条进行?断,那么子接口的优先级更高:函数签名相同时,优先选择
?有最具体实现的默认方法的接口,即如果 B 继承了 A ,那么 B 就比 A 更加具体。
(3) 最后,如果还是无法?断,继承了多个接口的类必须通过显式??和调用期望的方法,显式地选择使用哪一个默认方法的实现。
小结
- Java 8中的接口可以通过默认方法和静态方法提供方法的实现。
- 默认方法的开头以关键字default修饰,方法体育常规的类方法相同。
- 向发布的接口添加抽象方法不是源码兼容的。
- 默认方法的出现能帮助库的设计者以后向兼容的方式演进API。
- 默认方法可以用于创建可选方法和行为的多继承。
- 我们又办法解决由于一个类从多个接口中继承了拥有相同签名的方法而导致的冲突。
- 类或者父类中声明的方法的优先级高于任何默认方法。如果前一条无法解决冲突,那就选择同函数签名的方法中实现得最具体的那个接口的方法。
- 两个默认方法都同样具体时,你需要在类中覆盖方法,显示地选择使用哪个接口中的提供的默认方法。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/100147.html