时间:2021-05-19
在Java 8之前,默认情况下,接口中的所有方法都是公共的和抽象的。但是这一限制在Java 8中被打破了,Java 8允许开发人员在接口中添加新方法,而无需在实现这些接口的类中进行任何更改。
主要是为了方便扩展已有接口;如果没有默认方法,假如给Java中的某个接口添加一个新的抽象方法,那么所有实现了该接口的类都得修改,影响将非常大。
举个例子,Sortable <T>接口以及实现该接口的类SortableNumberCollection和SortableStringCollection。该接口有两种方法:void sort(); 和T peek()。
public interface Sortable<T> { void sort(); T peek();}sort()方法用于对象排序,T peek()用于获取指定元素,另外需要一个比较器类ObjectComparator来对对象进行排序。
public class ObjectComparator implements Comparator<Comparable> { @Override public int compare(Comparable o1, Comparable o2) { return o1.compareTo(o2); }}SortableStringCollection是一个自定义集合类可以进行排序,并查看字符串指定元素,代码如下:
public class SortableStringCollection implements Sortable<String> { private List<String> items = new ArrayList<>(); public void add(String item) { items.add(item); } @Override public void sort() { items.sort(new ObjectComparator()); } @Override public String peek() { return items.get(0); }}同样,SortableNumberCollection是一个自定义集合类,其中包含可以使用接口方法进行排序和查看的数字列表指定元素,代码如下:
public class SortableNumberCollection implements Sortable<Integer> { private List<Integer> items = new ArrayList<>(); public void add(Integer item) { items.add(item); } @Override public void sort() { items.sort(new ObjectComparator()); } @Override public Integer peek() { return items.get(0); }}在Java8之前如果对接口Sortable<T>添加新方法:T sortAndPeek(),那么SortableStringCollection和
SortableNumberCollection都必须实现T sortAndPeek()方法。
Java8之后提供了一种新的实现方式,默认方法 default method,我们可以对Sortable<T>进行如下改造:
public interface Sortable<T> { void sort(); T peek(); default T sortAndPeek(){ // New 'default method' added in the interface sort(); return peek(); }}同时SortableStringCollection和SortableNumberCollection类不需要任何更改。这样可以减少我们对原有代码的改动。同时如果需要,还可以在实现此接口的任何类中重写该方法T sortAndPeek()的默认实现。
在下图中我们看到default Method不通的标识:
如果两个或多个接口具有相同的默认方法签名,并且一个类实现了这两个接口,则将引发编译时错误。例如:
public interface Interface1 { void methodOne(String str); default void newMethod(){ System.out.println("Interface1: Newly added method"); }}public interface Interface2 { void methodTwo(String str); default void newMethod(){ System.out.println("Interface2: Newly added method"); }}public class InterfaceImplementation implements Interface1, Interface2{ @Override public void methodOne(String str) { System.out.println("Overridden methodOne: " + str); } @Override public void methodTwo(String str) { System.out.println("Overridden methodTwo: " + str ); }}此时代码会提示如下异常:
InterfaceImplementation inherits unrelated defaults for newMethod() from types Interface1 and Interface2
要解决此问题,我们将必须重写类InterfaceImplementation中的方法:
public class InterfaceImplementation implements Interface1, Interface2{ @Override public void methodOne(String str) { System.out.println("Overridden methodOne: " + str); } // newMethod implemented to resolve the conflict. @Override public void newMethod() { System.out.println("InterfaceImplementation: Newly added method"); } @Override public void methodTwo(String str) { System.out.println("Overridden methodTwo: " + str ); }}我们总结一下:
接口定义的静态方法独立于任何对象调用。所以,在调用静态方法时,不需要实现接口,也不需要接口的实例,
就像“默认方法”一样,“静态方法”也可以添加到接口中。例如,我们可以添加一个静态方法Direction getDefaultDirection(),该方法将返回默认Direction,例如:
public interface Sortable<T> { Direction defaultDirection = Direction.DESC; enum Direction { ASC, DESC }; void sort(); T peek(); static Direction getDefaultDirection(){ // 'static method' added to the interface. return defaultDirection; }}在上面的示例中,可以使用类引用来调用静态Direction getDefaultDirection()方法:
Sortable.getDefaultDirection()接口是设计模式中一种开闭原则的体验,而java8赋予了接口新的特性,使得接口使用起来更加的得心应手了,这也有助于我们更加内聚自己的代码结构了。Java源码中也有很多场景使用到了默认方法,例如:Iterator接口,我们在开发中可以多使用一些新的特性从而提高开发效率及增加代码的健壮性。
public interface Iterable<T> { Iterator<T> iterator(); default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } } default Spliterator<T> spliterator() { return Spliterators.spliteratorUnknownSize(iterator(), 0); } }到此这篇关于Java8新特性之默认方法和静态方法的文章就介绍到这了,更多相关Java8默认方法和静态方法内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言上一篇文章30分钟入门Java8之lambda表达式,我们学习了lambda表达式。现在继续Java8新语言特性的学习,今天,我们要学习的是默认方法和静态接
前言之前两篇文章分别介绍了Java8的lambda表达式和默认方法和静态接口方法。今天我们继续学习Java8的新语言特性——方法引用(MethodReferen
为什么要单独写个Java8新特性,一个原因是我目前所在的公司用的是jdk8,并且框架中用了大量的Java8的新特性,如上篇文章写到的stream方法进行过滤ma
Java8新特性方法引用 对于引用来说我们一般都是用在对象,而对象引用的特点是:不同的引用对象可以操作同一块内容! Java8的方法引用定义了四种格式:引用静
一、Lambda表达式简介Lambda表达式,是Java8的一个新特性,也是Java8中最值得学习的新特性之一。(另一个新特性是流式编程。)Lambda表达式,