Java 1.8 default 接口默认方法
一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 - 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/
截止目前, 星球 内专栏累计输出 72w+ 字,讲解图 3103+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2400+ 小伙伴加入学习 ,欢迎点击围观
一、默认方法是什么?
在 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
方法。这样,就解决了默认方法的冲突问题。