当多个接口有同名同参数默认方法时,子类必须重写该方法;需用@Override注解,可调用InterfaceName.super.methodName()复用某接口实现,也可组合逻辑或自定义处理。

当一个类实现多个接口,而这些接口中定义了同名、同参数列表的默认方法时,Java 编译器会报错,要求你必须在子类中显式重写该方法。这不是可选项,而是强制规则——否则代码无法通过编译。
必须在子类中重写冲突方法
重写是解决默认方法冲突的第一步,也是最基础的手段。你不能让编译器“猜”用哪个实现,必须自己写清楚逻辑。
- 方法签名(名称 + 参数类型 + 参数顺序)必须与接口中完全一致
- 需添加 @Override 注解,便于编译器校验和团队理解
- 重写后的方法体可以是全新逻辑,也可以选择调用某个接口的默认实现
调用特定接口的默认实现
如果你不想从头写逻辑,只想复用某一个接口提供的默认行为,可以用 InterfaceName.super.methodName() 语法明确调用。
- 例如:接口 Flyable 和 Swimmable 都有 move() 默认方法,子类中可写:
Flyable.super.move(); - 注意:不能省略 super,也不能用接口名直接调用(如 Flyable.move() 是非法的)
- 只能在一个重写方法体内调用,不能在静态上下文或构造器中使用
结合业务逻辑做定制化处理
重写不只是“选一个”,更是表达意图的机会。你可以把多个默认行为组合起来,或者加判断分支。
立即学习“Java免费学习笔记(深入)”;
- 比如根据当前状态决定调用哪个接口的默认逻辑:
if (isFlying) Flyable.super.move(); else Swimmable.super.move(); - 也可以先执行公共前置操作,再委托给某一方:
logAction("move"); Flyable.super.move(); - 甚至完全忽略两个默认实现,写一套独立逻辑(如抛异常、返回空、走策略模式等)


















