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

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中Stream使用的一个注意事项

    Java8中Stream使用的一个注意事项

    最近在工作中发现了对于集合操作转换的神器,java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中S...

    阿杜7482021-02-04
  • Java教程Java实现抢红包功能

    Java实现抢红包功能

    这篇文章主要为大家详细介绍了Java实现抢红包功能,采用多线程模拟多人同时抢红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    这篇文章主要介绍了Java使用SAX解析xml的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程xml与Java对象的转换详解

    xml与Java对象的转换详解

    这篇文章主要介绍了xml与Java对象的转换详解的相关资料,需要的朋友可以参考下...

    Java教程网2942020-09-17
  • Java教程小米推送Java代码

    小米推送Java代码

    今天小编就为大家分享一篇关于小米推送Java代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    富贵稳中求8032021-07-12
  • Java教程升级IDEA后Lombok不能使用的解决方法

    升级IDEA后Lombok不能使用的解决方法

    最近看到提示IDEA提示升级,寻思已经有好久没有升过级了。升级完毕重启之后,突然发现好多错误,本文就来介绍一下如何解决,感兴趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程20个非常实用的Java程序代码片段

    20个非常实用的Java程序代码片段

    这篇文章主要为大家分享了20个非常实用的Java程序片段,对java开发项目有所帮助,感兴趣的小伙伴们可以参考一下 ...

    lijiao5352020-04-06
  • Java教程Java BufferWriter写文件写不进去或缺失数据的解决

    Java BufferWriter写文件写不进去或缺失数据的解决

    这篇文章主要介绍了Java BufferWriter写文件写不进去或缺失数据的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望...

    spcoder14552021-10-18