java8中对接口功能进行了增强,添加了以下两个需要自己实现的方法:
默认方法
使用default关键字实现默认方法,只要在接口中写默认实现就可以在各个子类中使用,当然也可以根据实际情况决定是否在子类中重写。但是也需要注意以下几点:
1.不能重写基类Object中的public方法
2.类优先原则:如果父类中有跟接口默认方法相同签名的方法,则使用父类中的方法。
3.需手动解决接口冲突:当接口A个接口B有相同签名的默认方法时,则实现类需要自己重写该方法。
静态方法
使用方式跟类一样,直接通过接口名进行调用,但需要注意的是:接口中的静态方法是不能继承的。
为什么接口要添加默认方法呢?
个人觉得是为了兼容JDK1.8之前的版本,在扩展已有接口的同时而不会影响他的实现类,就如Collection接口。试想,如果没有默认方法的话,我们要给所有集合类添加stream()方法是多么麻烦,相当于要给每个子类都实现这么个stream()方法。
机智的你可能会马上想到用下面的适配器来进行兼容,这样做虽然可以避免影响已有的子类,但用起来却很麻烦,需要给每处代码都加这么一句适配。
public class CollectionAdapter<E> {
private Collection<E> collection;
public CollectionAdapter(Collection<E> collection) {
this.collection = collection;
}
public Spliterator<E> spliterator() {
return Spliterators.spliterator(collection, 0);
}
public Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
}
java8 中的接口与抽象类的区别:
- 抽象类既可继承其他类也可实现其他接口,而接口就只能继承其他接口
- 接口变量都是public static final修饰的,而抽象的变量跟普通类没有什么区别
- 抽象类有构造方法,而接口没有
- 抽象类的静态方法能被继承,而接口的静态方法不能被继承
另注:IDEA不鼓励使用实例去调用静态方法,所以coding的时候,实例名点“.”的时候并不会提示出静态方法,需要自己全拼才能显示,而不是实例不能调用静态方法。