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升级到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方法可以作为工具方法来提供给大家进行方便调用!
Default好处
原先接口的缺陷是,修改接口后,则需要修改全部实现该接口的类,所以引进的默认方法。他们的目的是为了解决接口的修改与现有的实现不兼容的问题。
总结
到此这篇关于Java8接口中引入default关键字本质原因的文章就介绍到这了,更多相关Java8接口引入default关键字内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家
相关文章
JDK 5 提供的注解:Target、Inherited和Documented的区别
这篇文章主要介绍了JDK 5 提供的注解:Target、Inherited和Documented的区别,需要的朋友可以参考下2016-02-02Stream distinct根据list某个字段去重的解决方案
这篇文章主要介绍了Stream distinct根据list某个字段去重,stream的distinct去重方法,是根据 Object.equals,和 Object.hashCode这两个方法来判断是否重复的,本文给大家介绍的非常详细,需要的朋友可以参考下2023-05-05全解史上最快的JOSN解析库alibaba Fastjson
这篇文章主要介绍了史上最快的JOSN解析库alibaba Fastjson,对FastJson感兴趣的同学,一定要看一下2021-04-04SpringBoot+Shiro+LayUI权限管理系统项目源码
本项目旨在打造一个基于RBAC架构模式的通用的、并不复杂但易用的权限管理系统,通过SpringBoot+Shiro+LayUI权限管理系统项目可以更好的帮助我们掌握springboot知识点,感兴趣的朋友一起看看吧2021-04-04
最新评论