默认方法用default关键字在接口中提供可直接调用的实现,访问权限默认public,适合封装对象职责相关的通用逻辑,与static方法(工具函数)定位不同。

Java 接口中使用默认方法提供默认行为,核心是用 default 关键字在接口内直接写方法体,让所有实现类“开箱即用”,无需强制重写。
默认方法怎么定义和调用
在接口中声明时必须加 default 修饰符,并提供完整方法体(不能空着)。实现类可直接通过实例调用,就像调用自己的方法一样。
- 接口里写:
default void log() { System.out.println("Default log"); } - 实现类不写任何代码,也能执行
obj.log() - 方法访问权限默认是 public,可省略,但不能写
private或protected
默认方法适合封装什么逻辑
它不是万能工具箱,而是为“某个对象该做的事”提供通用实现,强调语义归属和可定制性。
- 比如
Collection.stream():每个集合对象都该有能力转成流,逻辑依赖spliterator()等抽象方法,适合用 default - 可以调用本接口其他 default 或 abstract 方法,形成组合逻辑
- 避免在 default 方法里强转
this成具体类型,否则破坏接口抽象边界
多个接口有同名默认方法怎么办
当一个类同时实现多个接口,且它们都提供了签名相同的 default 方法,Java 编译器会拒绝编译——必须由你显式解决。
- 实现类中必须用
@Override重写该方法 - 可在重写方法中选择调用某一方的默认实现,例如:
InterfaceA.super.log(); - 如果该类还继承了父类,且父类有同签名方法,则父类方法优先,接口 default 不生效
默认方法和 static 方法别混用
两者定位完全不同:default 是实例行为,static 是工具函数。
-
default:通过对象调用,可被重写,能访问
this和其他接口方法 -
static:只能用
InterfaceName.method()调用,不能被继承或重写,没有this - 比如格式化时间、校验字符串这类无状态操作,应归 static;而“这个列表怎么排序”“这条消息怎么发送”,属于对象职责,用 default
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











