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

发表于:2022-1-07 09:35

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:测试开发Kevin    来源:今日头条

  接口的常规实现方式
  熟悉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升级到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,一切正常,没有任何错误提示:
  详解Java8接口中引入default关键字的本质原因
  实例化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方法可以作为工具方法来提供给大家进行方便调用!

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号