在Java中,当类重写接口的default方法且需调用原默认实现时,必须使用InterfaceName.super.methodName()语法;该调用仅限于实现类的实例方法内,用于显式调用本接口定义的default方法,解决多接口同名default方法冲突时的消歧。

在 Java 中,当子类(或实现类)重写了接口的 default 方法,又想在重写方法中调用原接口的默认实现时,可以使用 InterfaceName.super.methodName() 语法。这类似于子类调用父类方法的 super.method(),但因为接口没有继承链上的“父类”概念,所以必须显式指定接口名。
什么时候必须用 Interface.super.method()?
只有当类实现了某个接口,并且该接口有 default 方法,同时这个类自己也提供了同签名的实现(即重写),此时若需复用接口中原有的默认逻辑,就必须用 Interface.super.method() 显式调用——不能用 super.method()(编译报错),也不能直接调用(那会变成递归)。
基本写法和注意事项
- 语法格式严格为:
接口名.super.方法名(参数),例如MyInterface.super.doWork() - 只能在实现该接口的类内部使用,且仅限于调用本接口定义的
default方法(不能跨接口调用其他接口的 default 方法,除非该类也实现了那个接口) - 不能在静态方法、初始化块或匿名内部类中直接使用(必须在实例方法内,且该类是接口的实现类)
- 如果多个接口提供了同名 default 方法,而类未重写,则编译器会报错(冲突),此时必须在类中重写并明确用某个接口的
Interface.super.method()来消歧
典型应用场景示例
比如一个日志接口提供默认打印逻辑,子类想增强而不完全替换:
interface Logger {
default void log(String msg) {
System.out.println("[LOG] " + msg);
}
}
class FileLogger implements Logger {
@Override
public void log(String msg) {
// 先执行接口默认行为
Logger.super.log(msg);
// 再追加文件写入
writeToFile(msg);
}
private void writeToFile(String msg) {
// 实际写文件逻辑
}
}
这里 Logger.super.log(msg) 就是关键调用——它明确执行了 Logger 接口的 default 实现。
多接口冲突时的解决方式
若类同时实现两个都有同名 default 方法的接口,必须重写该方法,并在其中选择调用某一方:
interface A { default void run() { System.out.println("A"); } }
interface B { default void run() { System.out.println("B"); } }
class C implements A, B {
@Override
public void run() {
A.super.run(); // 明确选 A 的实现
// 或 B.super.run();
}
}
不重写会编译失败;重写后,A.super.run() 和 B.super.run() 都合法,取决于业务需要。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











