Java接口中default方法须用default关键字修饰、有方法体、仅限interface内声明、默认public且不可加static或private;多接口同名default方法需显式覆盖或用A.super.run()调用。

在 Java 中,接口定义 default 方法需用 default 关键字修饰,并提供完整方法体(不能以分号结尾),且只能出现在 interface 内部。
基本语法和写法要求
default 方法必须满足以下条件:
- 声明在 interface 中,不能在 class 或 abstract class 里使用
- 必须有方法体,即用花括号
{}包裹具体逻辑 - 不能加
static或private(Java 9+ 允许 private 辅助方法,但仅用于被 default 方法调用) - 访问修饰符默认是
public,不可显式写private、protected或static
一个可直接运行的示例
下面是一个标准写法:
interface Logger {
void log(String msg); // 抽象方法,必须由实现类提供
default void info(String msg) {
System.out.println("[INFO] " + msg);
}
default void warn(String msg) {
System.out.println("[WARN] " + msg);
}
}
实现类只需实现 log,就能直接调用 info 和 warn:
立即学习“Java免费学习笔记(深入)”;
class ConsoleLogger implements Logger {
public void log(String msg) {
System.out.println("LOG: " + msg);
}
}
// 使用:
ConsoleLogger logger = new ConsoleLogger();
logger.log("start"); // 输出 LOG: start
logger.info("loaded"); // 输出 [INFO] loaded
多接口冲突时的处理规则
当一个类同时实现多个含同名 default 方法的接口时,编译器会报错,必须显式覆盖该方法:
- 例如接口 A 和 B 都有
default void run(),实现类 C 必须重写run() - 若想复用某个接口的版本,可用
A.super.run()或B.super.run()显式调用 - 类中已有的同签名方法(哪怕来自父类)优先级高于接口 default 方法
适用场景与设计建议
default 方法适合添加无状态、通用、非核心的辅助行为:
- 日志封装、格式化工具方法(如
toJson()、toXml()) - 空值检查、缓存判断等模板逻辑
- 避免为每个实现类重复编写相同样板代码
- 不适用于需要访问实例字段或依赖构造逻辑的场景——那更适合抽象类


















