上一篇文章参考ImportNew,对Java8语言新特性进行了大概分析。这篇文章我们深入分析一下新特性之一:接口的默认方法。
在java8之前,接口中的方法仅仅是一个定义,是没有方法体的。这也是它和抽象类的一个差别。
在java8中,接口中新引入了默认方法。
什么是默认方法?
即方法使用default进行修饰,并且有具体的实现。如下面的Collection接口中的stream()方法。
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
知道了默认方法的定义后,我们来思考为什么要引入默认方法?
首先接口的好处我们是知道的,接口是一种规范。我们会定义接口,在其中声明一些变量和方法,然后再写一些实现类,“接口+实现”最常见的优势就是实现类和接口分离,在更换实现类的时候,不用更换接口功能。这也是面向对象的一种体现。但接口的缺陷也是很明显的,那就是当我们修改接口时,要修改这接口所有的实现类。这种修改的影响范围很大,对于已经发布的版本修改起来很麻烦,有的也不能随意进行修改。而默认方法就很好的解决了这个问题。默认方法很好的解决接口的修改与现有的实现不兼容的问题。我们在接口中加上默认方法,那他的实现类都会继承该默认方法。
下面举个例子:
public interface Father {
default void func(){
System.out.println("Father func");
}
}
public class Test1 implements Father{
public static void main(String[] args) {
Test1 test1 = new Test1();
test1.func();
}
}
输出Father func
public interface Son extends Father {
default void func(){
System.out.println("Son func");
}
}
public class Test implements Father,Son{
public static void main(String[] args){
new Test().func();
}
}
输出Son func
这里要注意,如果同时实现父接口和子接口,那实现类中调用子接口和父接口中都有的默认方法时,默认调用的是子接口的默认方法。
如果要调用父接口的默认方法,使用Father.super.func();