java接口默认方法可被实现类重写,需用@override注解、保持签名一致;多接口同名默认方法时必须重写;static和private接口方法不可重写。

Java 接口的默认方法可以被实现类(常被误称为“子类”,严格来说是“实现类”)重写,但需满足几个关键条件和规范。重写不是强制的,而是可选的;只有当实现类需要改变默认行为、或面临多接口冲突时,才必须重写。
重写的前提:实现类必须显式声明 @Override
实现类若要重写接口默认方法,必须使用 @Override 注解,并提供与接口中完全一致的方法签名(方法名、参数类型、数量严格相同,返回值支持协变)。编译器靠这个注解校验是否真正在重写,避免拼写错误或参数偏差导致意外变成重载。
- 正确示例:public void honk() { System.out.println("Electric beep!"); }
- 错误写法:public void honk(String tone) {...} → 变成重载,不触发重写逻辑
- 不加 @Override 也能编译通过,但失去编译期保护,强烈建议始终添加
多接口同名默认方法时,重写是强制的
当一个类同时实现多个接口,且这些接口都定义了签名相同的 default 方法(如 A.honk() 和 B.honk()),Java 编译器会直接报错:“class C inherits unrelated defaults for honk() from types A and B”。此时,该类必须重写 honk() 方法,否则无法通过编译。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 重写体内可选择调用某一方的默认实现,例如:A.super.honk();
- 也可组合逻辑,比如先调用 A.super.honk(),再执行自定义日志
- 不能只写 super.honk() —— 必须明确指定接口名
重写后的行为遵循动态分派规则
一旦被重写,调用该方法时将完全按照运行时对象的实际类型决定执行哪个版本,即标准的多态行为。接口默认方法本身不参与继承链中的“覆盖优先级”竞争,但一旦被实现类重写,它就成为该类自己的实例方法。
- 例如:Vehicle v = new Car(); v.honk(); → 执行 Car 中重写的版本
- 即使后续新增父类(如 Car extends VehicleBase),只要 VehicleBase 里没有 honk(),就不影响该调用路径
- 注意:默认方法永远不能覆盖 Object 类的 public 方法(如 toString、equals),这类声明会被忽略
不能重写的几种情况
有些看似相似的操作并不属于合法重写,需特别注意:
- static 接口方法:只能通过接口名调用(如 MyInterface.doWork()),实现类无法重写,也不继承
- private 接口方法(Java 9+):仅用于辅助 default 方法,不可被实现类访问或重写
- final 方法:接口中不允许用 final 修饰 default 方法,语法不合法
- 抽象类中的方法:若类同时继承抽象类并实现接口,且两者有同名方法,优先采用抽象类中的实现(无需重写),除非接口方法签名与抽象类方法不同
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










