默认方法用default关键字定义,提供可直接使用的实现,必须有方法体且默认public;可被实现类继承或重写;多接口同名时需显式重写并选择调用A.super或B.super;应聚焦对象自身行为,避免强转this。

接口中默认方法用 default 关键字定义,它让接口既能保持契约性,又能提供可直接使用的实现,特别适合接口升级和通用行为复用。
定义规则:必须显式、有体、public
默认方法不是“隐式默认”,必须写 default 修饰符,且不能省略方法体(不能只写分号)。访问权限默认是 public,即使不写也不能加 private 或 protected(Java 9+ 才支持 private 接口方法)。
- 正确写法:
public default void log() { System.out.println("logged"); }或简写为default void log() { ... } - 错误写法:
void log();(这是抽象方法)、public void log() { ... }(缺 default,编译报错)、default void log();(无方法体,编译失败)
使用方式:对象调用,可继承也可重写
默认方法通过实现类的实例调用,就像普通实例方法一样。实现类无需强制重写,不写就自动用接口提供的默认逻辑;想定制行为,就用 @Override 重写。
- 未重写时:创建实现类对象后直接调用,如
obj.doWork(),实际执行的是接口里的默认实现 - 重写时:实现类中加
@Override public void doWork() { ... },调用时走重写版本 - 注意:重写后访问权限不能比接口中更严格,比如接口是
public default,实现类重写就必须是public
冲突处理:多接口同名 default 必须显式解决
当一个类同时实现多个接口,而这些接口都定义了签名相同的 default 方法时,Java 编译器会拒绝编译,并提示 “inherits unrelated defaults”。这时必须在该类中显式重写这个方法,明确行为意图。
- 例如:接口 A 和 B 都有
default void start() { ... },实现类 C 必须写@Override public void start() { ... } - 可在重写方法中选择调用某一方:
A.super.start()或B.super.start()
设计建议:聚焦“对象自身行为”,避免越界
default 方法应表达“这个对象自己能做的事”,而不是依赖具体实现细节。
- 适合场景:集合的
forEach()、sort(),或业务接口的通用校验、日志模板 - 避免做法:在 default 方法里强转
this成某个具体类,或调用this.getClass()—— 这会悄悄绑定实现类型,违背接口抽象原则 - 复杂逻辑建议拆到 static 工具方法中,default 方法只做协调调用

















