服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 详解Java8接口中引入Default关键字的本质原因

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

2022-01-06 21:00测试开发Kevin Java教程

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

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

接口的常规实现方式

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

定义一个接口

  1. public interface IDemo { 
  2.     void func1(); 

类CDemo1实现接口IDemo

  1. public class CDemo1 implements IDemo{ 
  2.     @Override 
  3.     public void func1() { 
  4.     } 

类CDemo2实现接口IDemo

  1. public class CDemo2 implements IDemo{ 
  2.     @Override 
  3.     public void func1() { 
  4.     } 

在IDemo中新增加方法func2()

  1. public interface IDemo { 
  2.     void func1(); 
  3.     void func2(); 

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

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

接口中的default

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

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

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

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

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

  1. default Stream<E> stream() { 
  2.  return StreamSupport.stream(spliterator(), false); 
  3.  
  4. default Stream<E> parallelStream() { 
  5.     return StreamSupport.stream(spliterator(), true); 
  6.  
  7. default Spliterator<E> spliterator() { 
  8.     return Spliterators.spliterator(this, 0); 
  9.  
  10. default boolean removeIf(Predicate<? super E> filter) { 
  11.     Objects.requireNonNull(filter); 
  12.     boolean removed = false
  13.     final Iterator<E> each = iterator(); 
  14.     while (each.hasNext()) { 
  15.         if (filter.test(each.next())) { 
  16.             each.remove(); 
  17.             removed = true
  18.         } 
  19.     } 
  20.     return removed; 

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

  1. public interface IDemo { 
  2.     void func1(); 
  3.     void func2(); 
  4.     default void func3(){ 
  5.         System.out.println("this is default func2"); 
  6.     } 

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

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

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

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

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

接口中的static

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

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

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

  1. IDemo.func4(); 

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

原文链接:https://www.toutiao.com/a7049532812554355238/

延伸 · 阅读

精彩推荐
  • Java教程Java8 CompletableFuture详解

    Java8 CompletableFuture详解

    这篇文章主要介绍了Java8 CompletableFuture详解,CompletableFuture extends Future提供了方法,一元操作符和促进异步性以及事件驱动编程模型,需要的朋友可以参考下...

    junjie4372019-11-24
  • Java教程Java实现商品管理系统代码实例讲解

    Java实现商品管理系统代码实例讲解

    这篇文章主要介绍了Java实现商品管理系统代码实例讲解,文中代码实例讲解的很清楚,有需要的同学可以借鉴参考下...

    nightelves117652021-08-15
  • Java教程解决springboot报错找不到自动注入的service问题

    解决springboot报错找不到自动注入的service问题

    这篇文章主要介绍了解决springboot报错找不到自动注入的service问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐...

    Sum_mer_11217472021-11-16
  • Java教程Java异常处理深入理解

    Java异常处理深入理解

    这篇文章主要介绍了java项目常用异常处理汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...

    维斯布鲁克.猩猩3992021-10-27
  • Java教程SSH结合jquery实现三级联动效果

    SSH结合jquery实现三级联动效果

    这篇文章主要为大家详细介绍了SSH结合jquery实现三级联动效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    李佳和24354822020-07-25
  • Java教程Java CAS基本实现原理代码实例解析

    Java CAS基本实现原理代码实例解析

    这篇文章主要介绍了Java CAS基本实现原理代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以...

    与李2862020-07-31
  • Java教程Java通过PropertyDescriptor反射调用set和get方法

    Java通过PropertyDescriptor反射调用set和get方法

    这篇文章主要为大家详细介绍了Java通过PropertyDescriptor反射调用set和get方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    周XXXX4512020-08-22
  • Java教程java实现音频文件播放功能

    java实现音频文件播放功能

    这篇文章主要为大家详细介绍了java实现音频文件播放功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    mayifan_blog5062021-06-23