在Java8之前,一个接口中的所有方法默认都是public和abstract的。但这个限制在Java8中被打破,它允许开发人员在接口中添加新方法,而无需对实现这些接口的类进行任何更改。为什么会有默认方法?主要是为了方便扩展已有的接口;如果没有默认方法,如果在Java中给一个接口增加一个新的抽象方法,那么所有实现该接口的类都得修改,影响会非常大。例如,Sortable接口和实现该接口的类SortableNumberCollection和SortableStringCollection。该接口有两个方法:voidsort();和Tpeek()。publicinterfaceSortable{voidsort();Tpeek();}sort()方法用于对象排序,Tpeek()用于获取指定元素,需要一个比较器类ObjectComparator来对对象进行排序。publicclassObjectComparatorimplementsComparator{@Overridepublicintcompare(Comparableo1,Comparableo2){returno1.compareTo(o2);}}SortableStringCollection是一个自定义的集合类,可以对指定元素进行排序和查看字符串,代码如下:publicclassSortableStringCollectionimplementsSortable{privateList<字串>items=newArrayList<>();publicvoidadd(Stringitem){items.add(item);}@Overridepublicvoidsort(){items.sort(newObjectComparator());}@OverridepublicStringpeek(){returnitems.get(0);}}同理,SortableNumberCollection是一个自定义的集合类,其中包含指定的数字列表元素,可以使用接口方法进行排序和查看。代码如下:}@OverridepublicIntegerpeek(){returnitems.get(0);}}如果在Java8之前的接口Sortable中增加了一个新方法:TsortAndPeek(),那么SortableStringCollection和SortableNumberCollection都必须实现TsortAndPeek()方法。Java8之后,提供了新的实现方法。默认方法是默认方法。我们可以修改Sortable如下:变化。这样可以减少我们对原代码的改动。同时,如有必要,也可以在任何实现该接口的类中重写方法TsortAndPeek()的默认实现。在下图中我们看到了默认方法的标识:Usingdefaultmethodsinmultipleinheritance如果两个或多个接口具有相同的默认方法签名,而一个类实现了这两个接口,则会抛出编译时错误。例如:publicinterfaceInterface1{voidmethodOne(Stringstr);defaultvoidnewMethod(){System.out.println("Interface1:Newlyaddedmethod");}}publicinterfaceInterface2{voidmethodTwo(Stringstr);defaultvoidnewMethod(){System.out.println("Interface2:Newlyaddedmethod");}}publicclassInterfaceImplementationimplementsInterface1,Interface2{@OverridepublicvoidmethodOne(Stringstr){System.out.println("OverriddenmethodOne:"+str);}@OverridepublicvoidmethodTwo(Stringstr){System.out.println("OverriddenmethodTwo:"+str);}}这时候代码会提示如下异常:InterfaceImplementationinheritsunrelateddefaultsfornewMethod()fromtypesInterface1andInterface2要解决这个问题,我们就要重写InterfaceImplementation类中的方法:"一:Overriddenmethodstr);}//newMethodimplementedtoresolvetheconflict.@OverridepublicvoidnewMethod(){System.out.println("接口Iimplementation:Newlyaddedmethod");}@OverridepublicvoidmethodTwo(Stringstr){System.out.println("OverriddenmethodTwo:"+str);}}总结一下:类中的方法优先级最高,父类中声明的方法占用precedance优先级高于任何声明的默认方法,如果第一条规则无法判断,则子接口具有更高的优先级:当函数签名相同时,优先选择默认方法最具体的接口,也就是说,如果B继承A,那么B比A更具体。最后,如果仍然有疑问,继承多个接口的类必须通过显式覆盖和调用所需方法来显式选择使用哪个默认方法实现。在静态中Java8中加入的方法接口定义的静态方法是独立于任何对象调用的,因此在调用静态方法时,不需要实现接口,也不需要重新调用接口的实例要求。就像“默认方法”一样,“静态方法”也可以添加到接口中。例如,我们可以添加一个静态方法DirectiongetDefaultDirection(),它会返回默认的Direction,例如:publicinterfaceSortable{DirectiondefaultDirection=Direction.DESC;enumDirection{ASC,DESC};voidsort();Tpeek();staticDirectiongetDefaultDirection(){//'staticmethod'addedtotheinterface.returndefaultDirection;}}在上面的示例中,可以使用类引用调用静态方向getDefaultDirection()方法:Sortable.getDefaultDirection()用于默认方法和staticmethod稍微思考一下接口是对设计模式中开闭原则的一种体会,java8赋予了接口新的特性,使得接口使用起来更加得心应手,也有助于我们更加凝聚自己的代码结构.Java源码中也有很多使用默认方法的场景,比如Iterator接口。我们可以在开发中使用一些新的特性来提高开发效率,增加代码的健壮性。publicinterfaceIterable{Iteratoriterator();defaultvoidforEach(Consumeraction){Objects.requireNonNull(action);for(Tt:this){action.accept(t);}}defaultSpliteratorspliterator(){returnSpliterators.spliteratorUnknownSize(iterator(),0);}}【小编推荐】Windows10这个功能已经被禁用了!教你如何彻底关闭C++,C++程序员谁先完蛋?2021年值得关注的人工智能趋势RAID磁盘阵列适合你吗?在一篇文章中了解Windows10是绝唱!微软新系统开始更改版本号