当前位置: 首页 > 科技观察

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

时间:2023-03-21 01:21:44 科技观察

Java8接口中引入Default关键字的本质原因详解所有类都必须实现这个新方法(即使这个新接口对某些类没有用处)。定义接口publicinterfaceIDemo{voidfunc1();}CDemo1实现接口IDemopublicclassCDemo1implementsIDemo{@Overridepublicvoidfunc1(){}}CDemo2实现接口IDemopublicclassCDemo2implementsIDemo{@Overridepublicvoidfunc1(){}}在IDemo中添加新方法func2()interface(void);voidfunc2();}可以看到在CDemo1和CDemo2中需要实现func2()方法,如下图:接口中default上面的实例导致了上面提出的问题。一旦一个新方法被添加到接口中,那么所有实现了该接口的类都必须实现这个新方法!那么,如果JDK中的一个核心接口需要改动,需要添加一些新的方法呢?这个工作量可想而知,我们来看看java.util.Collection接口。它在jdk1.7中的方法包括:而在JDk1.8中,Collection接口包括以下方法:新增的接口都默认装饰(jdk1.7升级到jdk1.8后,接口有重要变化),源码代码如下:(){returnSpliterators.spliterator(this,0);}defaultbooleanremoveIf(Predicatefilter){Objects.requireNonNull(filter);booleanremoved=false;finalIteratoreach=iterator();while(each.hasNext()){if(filter.test(each.next())){each.remove();removed=true;}}returnremoved;}我们不仅惊讶,这还是熟悉的界面吗?接口里面有方法实现代码!惊讶过后,我们想想作者的用意还是上面的代码,我们新增了一个方法func3(),完成了publicinterfaceIDemo{voidfunc1();voidfunc2();defaultvoidfunc3(){System.out.println("thisisdefaultfunc2");}}然后查看类CDemo1,一切正常,没有报错信息:实例化CDemo1后,可以正常调用func3方法,代码如下:publicstaticvoidmain(String[]args){CDemo1cd1=newCDemo1();cd1.func3();}阅读此处了解在接口中使用default关键字实现接口的好处。简单的四个字就是“方便扩展”!通过这种技术,可以在接口中加入新的方法,并且不会影响所有实现了该接口的类!包括jdk1.8新引入的Lambda表达式也是基于这个知识点!接口中的static同时,从jdk1.8开始,接口可以通过static关键字修饰方法,方法也可以实现staticvoidfunc4(){System.out.println("thisisstaticfunc4");}调用方法也很简单,interface.static方法,例如:IDemo.func4();大家可以理解为接口中的静态方法可以作为一个工具方法,方便大家调用!