JDK8 新特性:Default Method (默认方法)

2017年02月10日 10986点热度 1人点赞 0条评论

引言

虽然JDK8出来蛮久了, 但是很多JDK8的新特性并不了解。 比如在JDK8的接口之中, 新增了今天的主角default methods

要是您已经知道了这个东西, 还请轻喷!

比如下面的示例代码:

注意上面Math 之中的 default int multiply 。在这个方法之中, 已经有了一个默认的实现

为什么搞了这个东西出来?

起因是JDK8之中引入了Lambda表达式。 在很多接口之中, 需要新增一些方法。 但是, 如果这些通用接口里面新增方法, 所以实现了这个接口的类都会直接编译出错,可以说说完全没有向前兼容的特性了。

如何使用?

参考下面的Sample:

 

最终输出:

 

PS:这种default methods 在编程方法上, 也可以称为"防御性编程"

前面提到lambda要增加forEach()方法,看看实际例子:

 

参考自:https://zeroturnaround.com/rebellabs/java-8-explained-default-methods/

实现多个接口呢?

如果多个接口有相同的default method, 在 JDK8之中会编译报错!

参考下面的例子:

 

在两个不同的接口之中,都实现了相同的default method : sayHello()

在编译的时候, 会直接报错!

如果需要使用的话, 需要明确的指定是哪个接口的sayHello(),如下所示:

 

与抽象类的区别?

本质上,接口还是接口,并没有改变,因为接口还是不能:

  1. 保存类的状态
  2. 无法定义成员变量
  3. 没有构造函数

其他的不细说了, 就想起这三点。

本文翻译之:http://viralpatel.net/blogs/java-8-default-methods-tutorial/

根据自己的理解做了修正与补充。

另外, 除了这个default method, 接口还支持静态方法(不确定是不是jdk8才支持的)。

可以参考下面的帖子:http://blog.csdn.net/aitangyong/article/details/54134385

本文翻译为独立翻译, 转载请注明出处:
http://www.flyml.net/2017/02/10/jdk8-new-feature-default-method

RangerWolf

保持饥渴的专注,追求最佳的品质

文章评论