当类实现多个含同名同参default方法的接口时,必须显式重写该方法并提供完整实现;可调用InterfaceName.super.methodName()复用某接口逻辑,或自定义全部逻辑;仅当类及父类均未定义该方法时才触发此强制重写要求。

当一个类同时实现多个接口,而这些接口中定义了同名、同参数列表的 public default 方法时,Java 编译器会直接报错,拒绝编译。这不是警告,而是强制要求:子类必须显式重写该方法,不能跳过。
必须提供完整的方法重写
重写不是可选项,也不是只写个签名就行——你得写出带方法体的完整实现:
- 方法签名(名称、参数类型、返回类型)必须与接口中完全一致
- 必须加上
@Override注解(虽非语法强制,但强烈建议,避免误写) - 方法体不能为空逻辑却不写;哪怕只是调用某个接口的默认实现,也得明确写出来
- 只声明方法不写花括号和内容 → 编译失败
调用特定接口的默认实现
如果想复用某一个接口已有的逻辑,就在重写方法里用 InterfaceName.super.methodName() 显式调用:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 例如接口
Flyable和Swimmable都有default void move(),子类中可写:Flyable.super.move(); - 不能写
super.move()—— 编译器无法推断是哪个接口 - 可以组合调用,比如先执行
A.super.log(),再加自己的日志增强逻辑 - 只能调用本类所实现的那些接口中的
default方法,不能跨接口调用未实现的接口
重写时可自定义全部逻辑
重写不等于“转发”。你可以完全忽略所有接口的默认实现,按需编写新逻辑:
立即学习“Java免费学习笔记(深入)”;
- 直接写业务代码,比如校验 + 记录 + 发通知
- 根据上下文决定行为,比如读配置决定走 A 还是 B 的策略
- 甚至抛异常或返回空值(需确认是否符合语义)
- 关键在于:这个方法在当前类中,到底该做什么,而不是“选一个现成的”
注意优先级关系
重写之前,先确认有没有更高优先级的实现存在:
- 如果父类(或本类)已经提供了同名
public方法,那它自动生效,不触发接口默认方法冲突 - 只有当类自身没定义、父类也没定义,且多个接口都提供了
default实现时,才必须重写 - 接口里的
static方法不参与冲突,也不可被继承或重写

















