允许,且默认方法不破坏函数式接口的“单抽象方法”规则;因其自带实现,不计入抽象方法数,静态方法和重写的Object方法同理。

允许,而且很常见。默认方法不会破坏函数式接口的“单抽象方法”规则,因为它们自带实现,不算抽象方法。
为什么默认方法被允许
函数式接口的核心要求是有且仅有一个抽象方法。默认方法用 default 关键字声明,已有具体实现,编译器不把它计入抽象方法数量。同理,静态方法、重写的 Object 方法(如 toString()、equals())也不影响判定。
怎么写一个带默认方法的函数式接口
直接在接口里用 default 修饰符定义即可。下面是一个典型例子:
// 推荐加上 @FunctionalInterface 注解,让编译器帮你检查
@FunctionalInterface<br>
public interface Calculator {<br>
int compute(int a, int b); // 唯一抽象方法<br><br>
// 默认方法:提供加法的默认实现<br>
default int add(int a, int b) {<br>
return a + b;<br>
}<br><br>
// 默认方法:也支持复杂逻辑,比如日志+计算<br>
default int safeCompute(int a, int b) {<br>
System.out.println("Executing compute with " + a + " and " + b);<br>
return compute(a, b);<br>
}<br>
}
使用时要注意什么
- 实现类可以直接调用默认方法,无需重写
- 实现类可以按需重写默认方法,覆盖其行为
- 多个接口含同名默认方法时,实现类必须显式重写该方法,否则编译报错(避免冲突)
- 不能为
Object类的方法(如toString、equals)提供默认实现——这是 Java 语言限制,接口中声明会编译失败
和 Lambda 表达式共存没问题
即使接口带默认方法,你依然能用 Lambda 创建实例,只要满足抽象方法签名。例如:
Calculator calc = (x, y) -> x * y; // 实现 compute 抽象方法<br> System.out.println(calc.add(3, 4)); // 调用默认方法,输出 7


















