美文网首页
详解Java8接口中引入default关键字的本质原因

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

作者: 测试开发Kevin | 来源:发表于2022-01-05 10:39 被阅读0次

接口的常规实现方式

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

类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升级到jdk1.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关键字的本质原因

    接口的常规实现方式 熟悉java接口的同学都知道,接口被某些类实现后,一旦在接口中增加了新方法,那么实现该接口的所...

  • default关键字

    default是在java8中引入的关键字,被default标识的方法也可称为Virtual extension ...

  • 1.8中的default方法

    在java8以后,接口中可以添加使用default或者static修饰的方法。default修饰方法只能在接口中使...

  • java8特性简单介绍

    接口默认方法支持 通过使用default关键字,java8可以在接口中增加非抽象的方法实现,这个功能也被称之为扩展...

  • Java8 default关键字

    在学习集合代码时发现在Iterable接口中使用了default关键字。 default关键字介绍 default...

  • java8接口中的默认方法

    java8接口中的默认方法 概述默认方法 java8中可以在接口中定义一个default修饰的方法,例如: 这样任...

  • Java8中的default方法

    在java8以后,接口中可以添加使用default或者static修饰的方法,在这里我们只讨论default方法,...

  • Jdk1.8关键字default和Stream流

    default 新增了一个default关键字,在接口中,可以实现方法,然后用default修饰,那么在实现类中不...

  • java8 新特性总结

    java8新特性 1.接口方法默认实现:java8中接口方法可以有默认实现,需要加入default关键字。 2.L...

  • Koltin之类的定义

    类的定义 接口 interface 类似 Java8 接口中的方法可以有默认实现,但是不需要 default 关键...

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/awehcrtx.html