java中父类方法优先级高于接口方法,无论接口方法是抽象还是default;父类存在可访问同签名方法时,接口方法被屏蔽,不参与调度。

Java中类同时继承父类并实现接口时,同名方法的调用不靠“协商”,而由明确的层级规则决定:父类方法优先级高于接口方法,无论接口方法是抽象的还是 default 的。
父类方法存在时,接口方法被完全忽略
只要父类(含祖先类)中声明了同签名方法(public/protected/包访问权限),Java编译器和运行时就不再考虑任何接口中的对应方法——不管是抽象方法还是 default 方法。这不是覆盖,而是路径屏蔽。
- 父类有 public void run() → 子类调用 run() 执行父类版本,接口 default run() 不参与调度
- 父类有 abstract void save() → 子类必须提供具体实现,该实现即为最终版本;接口的 default save() 被跳过,不能自动复用
- 父类方法为 private → 子类无法继承,此时回归接口规则(如多接口 default 冲突需显式重写)
- 父类方法为包私有且子类跨包 → 不可见,等效于无父类实现,触发接口冲突检查
父类无同名方法时,才看接口
只有当父类体系中完全不存在同签名方法,才会进入接口层面判断。此时分两种情况:
- 接口中是 抽象方法 → 子类必须实现,否则需声明为 abstract;多个接口含同名抽象方法,只需实现一次
- 接口中是 default 方法 → 若仅一个接口提供 default,则直接继承;若多个无关接口都提供同签名 default 方法(如 I1 和 I2 均有 default void log()),则编译报错,子类必须显式重写,并可用 I1.super.log() 或 I2.super.log() 明确调用某一方
子类未重写时的实际行为
如果父类提供了可访问的具体方法,而子类未重写,也未实现接口中的抽象方法,那么:
- 该父类方法会自动作为接口方法的实现,满足接口契约
- 通过子类实例调用,执行父类逻辑
- 向上转型为接口类型后调用,仍执行父类版本(非接口 default 版本)
- 注意:super.method() 在子类重写方法内调用的是父类版本,不是接口版本;InterfaceName.super.method() 才能显式调用某个接口的 default 实现
修饰符与签名匹配是前提
优先级规则生效的前提是方法签名完全一致(方法名 + 参数列表 + 返回类型),且父类方法可被继承:
- 参数不同 → 视为重载,各自独立,可共存
- 返回类型不同但参数相同 → 编译错误,无法区分重写目标
- 父类方法为 private / final → 不可被继承或重写,不参与优先级判定
- 接口 default 方法本质是 public,但能否“胜出”取决于父类是否让路
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











