Java要求实现类显式覆盖同名default方法,因super只指向父类而非接口;必须先重写方法,再用InterfaceName.super.method()调用指定接口实现。

当一个类实现多个接口,而这些接口中存在同名的 default 方法时,Java 编译器会报错,要求你**显式覆盖该方法**。此时不能直接用 A.super.method() 或 B.super.method() 调用,必须先在类中重写方法,再在重写方法体内用 InterfaceName.super.method() 明确调用某个接口的默认实现。
为什么不能直接在类中写 A.super.method()?
因为 super 在类中指向的是**直接父类**(即 extends 的那个类),而接口不是类的父类,不参与继承链。所以 A.super.method() 这种写法只在**接口中调用其父接口的 default 方法**时合法;在**实现类中**,必须先重写同名方法,才能用 InterfaceName.super.method() 语法选择具体实现。
正确解决步骤(三步走)
-
编译器强制你重写冲突方法:实现类必须提供自己的
public void methodName()实现,否则编译失败。 -
在重写方法里明确选择调用来源:用
InterfaceA.super.methodName()或InterfaceB.super.methodName()调用指定接口的 default 版本。 - 可组合逻辑或做适配:比如调用两个接口的方法、加日志、合并返回值等,不局限于只选一个。
代码示例
假设有两个接口:
default void move() { System.out.println("Flying"); }
}
interface Swimmable {
default void move() { System.out.println("Swimming"); }
}
实现类必须这样写:
立即学习“Java免费学习笔记(深入)”;
class Duck implements Flyable, Swimmable {@Override
public void move() {
Flyable.super.move(); // 输出 Flying
Swimmable.super.move(); // 输出 Swimming
}
}
注意事项
- 只能在重写方法内部使用
InterfaceName.super.method(),不能在构造器、静态方法或字段初始化中用。 - 如果某个接口的 default 方法被另一个接口
extends并重写了,那么子接口的版本优先;调用时仍需写子接口名(不是原始定义接口名)。 - 若某接口的 default 方法抛出受检异常,而另一接口没抛,重写方法的
throws声明需兼容两者(取并集)。


















