父类方法优先级最高,default方法自动失效;多个无关接口同名default方法必须显式重写并用InterfaceName.super.methodName()调用指定实现;抽象方法存在时default方法不参与决策。

父类抽象方法与子类默认方法不会发生“冲突”,因为根本不存在这种组合:子类不能定义接口的默认方法,更不可能在继承父类的同时“在自己内部声明一个 default 方法”。关键在于厘清主体——default 方法只能定义在接口中,而“父类抽象方法”属于类体系。真正需要判断的是:当一个类同时继承父类(含抽象或具体方法)并实现接口(含 default 方法)时,同名方法的调用归属规则。
父类方法优先级最高,default 方法自动失效
只要父类(包括直接父类或更高层祖先类)中已声明同签名方法(无论 public、protected 或包访问权限;也无论该方法是具体实现还是 abstract),Java 就完全忽略所有接口的 default 实现。这不是覆盖,而是直接不考虑接口路径。
- 父类有
public void run()→ 子类调用run()执行父类版本,接口 default run() 不参与调度 - 父类有
abstract void run();→ 子类必须提供实现(否则自身需声明为 abstract),该实现即为最终版本,接口 default run() 仍被跳过 - 即使接口 default 方法逻辑更合理,只要父类体系存在同名方法,它就拥有绝对优先权
抽象方法强制实现,default 方法不构成备选
如果某个接口只声明了抽象方法 void save();,另一个接口提供了 default void save() { ... },而子类同时实现这两个接口,那么子类必须实现 save()。此时 default 版本不会被自动采用,也不构成“可选继承”——抽象方法的存在使 default 方法彻底退出决策链。
- 子类实现的
save()就是唯一有效版本 - 不能写
InterfaceB.super.save();来复用 default 实现(语法虽合法,但无意义,因抽象方法已要求你提供完整实现) - 这种场景下不存在编译错误,因为抽象方法的契约压倒一切
只有“多个无关接口 default 方法同名”才触发显式覆盖要求
真正的 default 方法冲突,只发生在类同时实现两个及以上互不继承的接口,且这些接口都提供了同签名 default 方法。此时父类不存在同名方法,也没有抽象方法介入,Java 编译器才会报错 “inherits unrelated defaults”。
立即学习“Java免费学习笔记(深入)”;
- 错误示例:
class X implements A, B,其中A和B都有default void log(),且B并未 extendsA - 解决方式:在
X中显式重写log(),并在方法体内用A.super.log()或B.super.log()明确指定来源 - 注意:此时若
X的父类已有log(),该冲突根本不会出现——父类方法直接胜出
static 方法完全不参与继承链,无需“冲突处理”
接口中的 static 方法不会被实现类继承,也不能被重写。即使父类、接口 A、接口 B 都定义了同签名的 static void init(),它们彼此独立。调用时必须带明确前缀:Parent.init()、A.init()、B.init()。不存在优先级比较,也不会引发编译错误。
- static 方法属于接口/类自身,不是实例行为
- 实现类可以定义同名 static 方法,但这属于新声明,与接口 static 方法无继承关系
- 它和 default 方法、抽象方法处于完全不同的机制维度


















