Java8 为什么在接口中引入default方法,以及default方法的使用

文章目录

    • Java8 为什么在接口中引入 default 方法
    • default 方法介绍
    • 如何使用
      • 接口中定义default方法
      • 实现类不实现 default 方法
      • 实现类实现 default 方法
      • 同时实现具有相同default方法的两个接口会怎样?
    • 在JDK中的使用

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中的使用

  1. java.util.Collection — 用于支持Stream的使用。
  2. java.lang.Iterable — 用于支持函数式编程。

你可能感兴趣的:(Java学习笔记,java,开发语言)