接口默认方法可被实现类重写,单接口时可选,多接口冲突时强制重写;重写须满足签名一致、public修饰等条件,static、private方法及父类已实现的方法不可重写。

接口中的默认方法可以被实现类重写,但必须遵循明确的语法规则和访问约束。重写不是可选动作,而是当多个接口提供同名默认方法时的强制要求;在单接口场景下,则属于可选优化行为。
重写的前提条件
只有满足以下全部条件,才能合法重写接口默认方法:
- 实现类使用 implements 显式声明实现该接口
- 方法签名(名称、参数类型列表、返回类型)与接口中完全一致(支持协变返回类型)
- 重写方法必须用 public 修饰——不能省略,也不能换成
protected或private - 不能加
default、static或abstract关键字
单接口场景下的重写
当类只实现一个接口,且该接口含默认方法时,重写是可选的:
- 不重写:直接继承并调用接口提供的默认逻辑,例如
car.honk()输出预设提示 - 重写:用
@Override标注,提供定制行为,比如增加日志或校验逻辑 - 若想复用原逻辑,可在重写方法中写
InterfaceName.super.methodName(),如Vehicle.super.honk()
多接口冲突时的强制重写
当类同时实现 无继承关系 的多个接口,且它们定义了同名同参的默认方法,编译器会报错:“inherits unrelated defaults”,此时必须重写:
- 必须提供完整方法体,不能只写签名
- 可选择调用某一方逻辑:
A.super.doWork()或B.super.doWork() - 也可组合调用,例如先执行
A.super.init()再执行B.super.cleanup() - 甚至可完全忽略两个默认实现,写全新业务逻辑
不能重写的几种情况
以下情形无法或不允许重写默认方法:
- 接口中的 static 方法:不属于继承体系,只能通过接口名调用,如
MyInterface.helper() - 父类已提供同签名实例方法:子类自动继承父类版本,无需也不允许再重写接口默认方法
- 接口中 private 默认方法:仅限本接口内其他默认/静态方法调用,实现类不可见、不可重写
- 把字段误当作方法:接口字段默认
public static final,和默认方法无关
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











