Java 1.8 default 接口默认方法

更新时间 2023-07-25 17:37:21

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书活动

目前, 星球 内第一个项目:全栈前后端分离博客项目,演示地址:http://116.62.199.48/, 1.0 版本已经更新完毕,正在更新 2.0 版本。采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 224 小节,累计 35w+ 字,讲解图:1544 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 1000+ 小伙伴加入,欢迎点击围观

一、默认方法是什么?

在 Java 8 之前,接口不能包含实现方法,只能声明抽象方法。然而,Java 8 引入了一个新特性,允许我们在接口中添加非抽象方法,也就是默认方法。这些默认方法带有 default 关键字。

默认方法的引入,主要是为了解决接口的修改与现有的实现不兼容的问题。当接口添加新方法时,如果不是默认方法,所有实现了该接口的类都需要修改,以实现新添加的方法。这样的设计对于已经大规模使用的接口来说显然不是一个好选择。

public interface Vehicle {
    default void print(){
        System.out.println("我是一辆车!");
    }
}

上面这个例子中,我们声明了一个名为 Vehicle 的接口,并定义了一个默认方法 print

二、如何使用默认方法?

实现了带有默认方法的接口的类,可以选择覆盖默认方法,也可以直接使用默认方法。这非常灵活。

public class Car implements Vehicle {

}

public class Bus implements Vehicle {
    @Override
    public void print() {
        System.out.println("我是一辆公交车!");
    }
}

在这个例子中,Car 类没有覆盖默认方法,当我们调用 print 方法时,将会执行 Vehicle 接口中的默认实现;而 Bus 类覆盖了默认方法,当我们调用 print 方法时,将会执行 Bus 类中的实现。

三、默认方法和多重继承

Java 不支持类的多重继承,但接口允许多重继承。如果一个类实现了多个接口,这些接口中有相同的默认方法,那么会出现什么情况呢?

public interface Vehicle {
    default void print(){
        System.out.println("我是一辆车!");
    }
}

public interface FourWheeler {
    default void print(){
        System.out.println("我是一辆四轮车!");
    }
}

public class Car implements Vehicle, FourWheeler {

}

在这个例子中,Car 类实现了 VehicleFourWheeler 两个接口,这两个接口都有一个名为 print 的默认方法。在这种情况下,Java 编译器会报错,因为它不知道应该选择哪一个默认方法。解决这个问题的方法是 Car 类需要覆盖 print 方法:

public class Car implements Vehicle, FourWheeler {
    public void print(){
        Vehicle.super.print();
    }
}

Car 类中,我们使用了 Vehicle.super.print(); 来调用 Vehicle 接口中的 print 方法。这样,就解决了默认方法的冲突问题。