当多个接口含同名同签名default方法时,实现类必须重写该方法并用InterfaceName.super.methodName()显式调用指定接口实现,否则编译失败;若继承父类且父类有同签名方法,则默认方法被忽略。

当一个类实现多个接口,而这些接口都定义了同名、同参数、同返回类型的 default 方法时,Java 不允许模糊调用,必须显式指定调用哪一个接口的默认实现。
必须重写冲突方法才能编译通过
Java 编译器会直接报错,提示类似:class X inherits unrelated defaults for method() from types A and B。这不是警告,而是编译失败。你不能跳过重写,也不能靠 Lombok 或注解绕过。
- 在实现类中用
@Override提供完整方法体 - 方法体里可完全自定义逻辑,也可只调用某一个接口的默认实现
- 即使只是透传,也必须写出来
用 InterfaceName.super.methodName() 显式调用
这是 Java 唯一合法的跨接口调用默认方法的语法,关键点如下:
- 接口名不可省略,
super.methodName()单独写会编译失败 - 仅适用于
public default方法,static或private default不支持 - 可在同一方法中组合调用,比如先执行
A.super.log(),再加日志增强或参数校验 - 不能在静态方法、lambda 表达式或构造器中使用
父类方法优先,不参与冲突判定
如果该类继承了父类,且父类已有同签名的 public 或 protected 方法,则所有接口的默认方法都会被忽略,不会触发冲突。
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
立即学习“Java免费学习笔记(深入)”;
- 此时直接调用
super.methodName()就是调用父类实现 - 若仍想调用某个接口的默认方法,仍需用
InterfaceName.super.methodName() - 接口默认方法永远无法覆盖
Object类中的equals、hashCode等方法
实际调用示例
假设有两个接口:
interface Flyable { default void move() { System.out.println("Flying"); } }
interface Swimmable { default void move() { System.out.println("Swimming"); } }
实现类必须这样写:
class Duck implements Flyable, Swimmable {
@Override
public void move() {
Swimmable.super.move(); // 明确调用 Swimmable 的默认实现
}
}
如果还想兼顾飞行行为,可以扩展为:
@Override
public void move() {
Flyable.super.move();
System.out.println("then land on water");
Swimmable.super.move();
}

















