Java8之前,如果需要在一个已有的接口中添加一个方法,那么所有这个接口的实现类也都必须同时实现这个方法,否则程序将无法正常编译运行。
为了解决这一问题,Java8在接口中引入了 default 方法。
default 方法也被称之为守护方法(defender method)或者虚拟扩展方法(virtual extension method)。可以在接口中包含一些默认的包含方法体的方法,从而使得接口在进行扩展的时候,不会破坏它的实现类。
使用default关键字在接口中定义default方法
public interface Car {
default boolean canFly(){
return false;
}
}
毕竟当前的汽车都不能飞的嘛,所以基本上实现类都可以不用管这个default方法。
public class MyCar implements Car {
public static void main(String[] args) {
MyCar myCar = new MyCar();
System.out.println("我的车会飞吗? --> " + myCar.canFly());
}
}
运行结果:调用接口中定义好的default方法。
我的车会飞吗? --> false
假如哪一天有了可以飞的汽车,那么在实现类中实现这个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方法,像MyFlyCar那样。