文章目录
Java8 为什么在接口中引入 default 方法
Java8之前,如果需要在一个已有的接口中添加一个方法,那么所有这个接口的实现类也都必须同时实现这个方法,否则程序将无法正常编译运行。
为了解决这一问题,Java8在接口中引入了 default 方法。
default 方法介绍
default 方法也被称之为守护方法(defender method)或者虚拟扩展方法(virtual extension method)。可以在接口中包含一些默认的包含方法体的方法,从而使得接口在进行扩展的时候,不会破坏它的实现类。
如何使用
接口中定义default方法
使用default关键字在接口中定义default方法
public interface Car {
default boolean canFly(){
return false;
}
}
实现类不实现 default 方法
毕竟当前的汽车都不能飞的嘛,所以基本上实现类都可以不用管这个default方法。
public class MyCar implements Car {
public static void main(String[] args) {
MyCar myCar = new MyCar();
System.out.println("我的车会飞吗? --> " + myCar.canFly());
}
}
运行结果:调用接口中定义好的default方法。
我的车会飞吗? --> false
实现类实现 default 方法
假如哪一天有了可以飞的汽车,那么在实现类中实现这个default方法即可。
public class MyFlyCar implements Car {
@Override
public boolean canFly() {
return true;
}
public static void main(String[] args) {
MyFlyCar myCar = new MyFlyCar();
System.out.println("我的车会飞吗? --> " + myCar.canFly());
}
}
运行结果:调用实现类中的canFly方法。
我的车会飞吗? --> true
同时实现具有相同default方法的两个接口会怎样?
编译报错,因为编译器不知道该使用哪个接口中的default方法,它们的优先级是一样的。解决方法是在实现类中实现该default方法,像MyFlyCar那样。
在JDK中的使用
- java.util.Collection — 用于支持Stream的使用。
- java.lang.Iterable — 用于支持函数式编程。