Java 8 接口增强

x33g5p2x  于2021-12-18 转载在 其他  
字(1.0k)|赞(0)|评价(0)|浏览(314)

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的时候,实例名点“.”的时候并不会提示出静态方法,需要自己全拼才能显示,而不是实例不能调用静态方法。

相关文章