java8在接口中引入了默认方法,通过在方法前加上default关键字就可以在接口中写方法的默认实现
在java8中我们可以用集合的stream方法对集合进行函数式处理,这个方法在java8之前是没有的,那么它是如何对该接口进行增强并且不影响之前的实现类的呢?
在Collection类中可以看到
/**
* Returns a sequential {@code Stream} with this collection as its source.
*
* <p>This method should be overridden when the {@link #spliterator()}
* method cannot return a spliterator that is {@code IMMUTABLE},
* {@code CONCURRENT}, or <em>late-binding</em>. (See {@link #spliterator()}
* for details.)
*
* @implSpec
* The default implementation creates a sequential {@code Stream} from the
* collection's {@code Spliterator}.
*
* @return a sequential {@code Stream} over the elements in this collection
* @since 1.8
*/
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
在stream()方法中添加了default关键字,有了默认发放的引入后就可以对现有的接口进行增强了,如以上的代码,调用StreamSupport的stream方法返回了一个stream对象,这使得我们不需要在接口中增加方法后对已经存在的每个实现类进行实现该方法,做到了平滑的增强。
继承及实现中包含相同的方法时:
- 当继承的父类和实现的接口中有相同签名的方法时,优先使用父类的方法。
- 当接口的父接口中也有同样的默认方法时,就近原则调用子接口的方法。
- 当实现的多个接口中有相同签名的方法时,必须在实现类中通过重写方法解决冲突问题,否者无法通过编译,在重写的方法中可以通过 接口名.super.方法名(); 的方式显示调用需要的方法。
想一起交流或者有问题的朋友可以关注我的公众号,里面有群聊连接可以一起交流遇到的问题,如果失效可以后台回复我,每天会同步更新
博客连接 : AshinLee’s blog
公众号: