您的位置 首页 java

详解Java8接口中引入default关键字的本质原因

接口的常规实现方式

熟悉 java接口 的同学都知道,接口被某些类实现后,一旦在接口中增加了新方法,那么实现该接口的所有类都要实现这个新增的方法(即使这个新增的接口对某些类没有用处)。

定义一个接口

 public interface IDemo {
    void func1();
}  

CDemo1实现接口IDemo

 public class CDemo1 implements IDemo{
    @Override
    public  void  func1() {
    }
}  

CDemo2实现接口IDemo

 public class CDemo2 implements IDemo{
    @Override
    public void func1() {
    }
}  

IDemo中新增加方法func2()

 public interface IDemo {
    void func1();
    void func2();
}  

可以看到 CDemo1和CDemo2中需要强制实现方法func2(),如下图所示:

接口中的default

上面的实例导致了前面提出的那个问题,一旦在接口中增加了新方法,那么已经实现了该接口的所有的类都要实现这个新增的方法!那么,如果是 JDK 中的某个核心接口需要变更,需要新增某些方法呢?这个工作量更是可想而知,我们来看一下 java.util .Collection这个接口,它在jdk1.7中的方法包括:

而在JDk 1.8中 Collection 接口中包括方法如下:

其中新增的接口,都用default来修饰(jdk1.7升级到 jdk 1.8后,接口的重要变化),源代码如下:

 default Stream<E> stream() {
 return StreamSupport.stream(spliterator(), false);
}

default Stream<E> parallelStream() {
    return StreamSupport.stream(spliterator(), true);
}

default Spliterator<E> spliterator() {
    return Spliterators.spliterator(this, 0);
}

default  boolean  removeIf(Predicate<? super E> filter) {
    Objects.requireNonNull(filter);
    boolean removed = false;
    final  iterator <E> each = iterator();
    while (each.hasNext()) {
        if (filter.test(each.next())) {
            each.remove();
            removed = true;
        }
    }
    return removed;
}  

我们不仅大吃一惊,这还是我们熟知的接口吗?接口中的方法居然有了实现代码!吃惊过后,我们来想想作者的意图。还是上面的代码,我们新增方法 func3(),并完成简单的实现

 public interface IDemo {
    void func1();
    void func2();
    default void func3(){
        System.out.println("this is default func2");
    }
}  

然后查看类CDemo1,一切正常,没有任何错误提示:

实例化 CDemo1后,可以正常调用func3方法,代码如下:

 public  static  void main(String[] args) {
    CDemo1 cd1=new CDemo1();
    cd1.func3();
}  

读到这里发现接口中通过default关键字来进行接口实现的好处了吧,简单四个字就是 “方便扩展” !通过这个技术可以做到在接口中新增加方法并且不会影响到已经实现了该接口的所有的类!包括jdk1.8新引入的 Lambda表达式 也是基于这一知识点来实现的!

接口中的static

与此同时,从jdk1.8开始,接口中可以通过static关键字来修饰方法,同样可以对方法进行实现

 static  void func4(){
    System.out.println("this is static func4");
}  

调用方法也非常的简单,接口.static 方法,例如:

 IDemo.func4();  

大家可以这样理解,接口中的static方法可以作为工具方法来提供给大家进行方便调用!

以上就是时我对jkd接口中的default方法和static方法的总结,原创不易,如果文章帮到了大家,烦请点赞转发!

文章来源:智云一二三科技

文章标题:详解Java8接口中引入default关键字的本质原因

文章地址:https://www.zhihuclub.com/183161.shtml

关于作者: 智云科技

热门文章

网站地图