Java 1.8 default 接口默认方法
一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动
目前,正在
星球
内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.2 + Vite 4
,手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 144 小节,累计 22w+ 字,讲解图:923 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 440+ 小伙伴加入,欢迎点击围观
。
一、默认方法是什么?
在 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
类实现了 Vehicle
和 FourWheeler
两个接口,这两个接口都有一个名为 print
的默认方法。在这种情况下,Java 编译器会报错,因为它不知道应该选择哪一个默认方法。解决这个问题的方法是 Car
类需要覆盖 print
方法:
public class Car implements Vehicle, FourWheeler {
public void print(){
Vehicle.super.print();
}
}
在 Car
类中,我们使用了 Vehicle.super.print();
来调用 Vehicle
接口中的 print
方法。这样,就解决了默认方法的冲突问题。