JAVA8中新引入了接口的默认方法和接口的静态方法,至于为什么引入默认方法和静态方法,我们来看下这段话(菜鸟教程中的一段话):
为什么要有这个特性?
首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的java 8之前的集合框架没有foreach方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现。然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有的实现。所以引进的默认方法。他们的目的是为了解决接口的修改与现有的实现不兼容的问题。
上面说引入的目的是为了解决接口的修改与现有的实现不兼容的问题,在实际开发中确实有这个问题,想在一个现有接口中添加一个方法,就需要在把这个接口的所有实现类全部修改一遍,如果是在大型应用程序中想想就可怕。。。
默认方法和静态方法则是将方法的实现直接写在接口中,接口的实现类可以选择是否覆写默认方法,静态方法则不能被覆写,下面来看下语法:
- 默认方法:方法前面加上”default”关键字
- 静态方法:方法前面加上”static”关键字
interface TestService{
//默认方法
default void print(){
System.out.println("TestService default method");
}
//静态方法
static void methodA(){
System.out.println("this is static medthod");
}
}
到这也许你会想到一个场景,如果一个类实现多个接口并且接口中有相同的默认方法的情况,这里使用两个测试接口TestService和TestInterface并且两个接口都有默认方法print(),TestInterface接口代码如下:
interface TestInterface{
default void print(){
System.out.println("TestInterface default print");
}
}
实现类代码如下:
class TestClass implements TestInterface,TestService {
}
这时你会发现,这样写会编译报错如下:
这种情况JAVA8提供了两种处理办法:
- 方案一:
此类重写接口中的默认方法
class TestClass implements TestInterface,TestService {
@Override
public void print() {
System.out.println("TestClass print ");
}
}
使用这种方案,执行的则是实现类自己的方法,测试代码如下:
TestClass testClass = new TestClass();
testClass.print();
输出为:
TestClass print
- 方案二:
可以使用 super 来调用指定接口的默认方法
class TestClass implements TestInterface,TestService {
@Override
public void print() {
TestInterface.super.print();
}
}
使用这种方案输出的结果是使用super的接口中的默认方法的执行结果,测试代码如下:
TestClass testClass = new TestClass();
testClass.print();
输出为:
TestInterface default print
此处使用的是TestInterface.super,所以输出的是TestInterface接口中默认方法。
接口中的静态方法则和静态类中的静态方法一样。
总结:
接口的默认方法和静态方法实现了接口修改但是实现类不用修改的操作。
如果出现实现类的多个接口具有相同的默认方法,则可以使用重写默认方法或者使用接口的super关键字解决。