Java函数式接口允许声明Object类的public方法(如equals、hashCode、toString等),因其在所有类中已有默认实现,不增加抽象方法计数;同时可含default和static方法,但只能有一个非Object的抽象方法。

是的,Java 中的函数式接口允许包含 java.lang.Object 类中的 public 方法,比如 equals(Object)、toString()、hashCode() 等。
为什么 Object 的 public 方法不算抽象方法?
因为所有 Java 类(包括函数式接口的实现类)都隐式继承自 Object。这些方法在子类中天然具备默认实现,所以即使接口中声明了它们,也不会破坏“仅有一个抽象方法”的核心要求。
- 接口里写
boolean equals(Object obj);不会增加抽象方法计数 - 编译器识别这是来自
Object的方法,不视其为新增的抽象约束 - 哪怕接口同时定义了
void say();和boolean equals(Object);,它仍是合法的函数式接口
哪些 Object 方法可以放进去?
仅限 Object 类中声明为 public 的实例方法:
public boolean equals(Object obj)public int hashCode()public String toString()-
public Class> getClass()(虽不能被重写,但声明无害) -
public void notify()、public void notifyAll()、public void wait()等(极少用,但语法合法)
注意:protected 或包私有方法(如 clone() 默认是 protected)不能直接声明为 public 抽象方法,否则会变成真正的抽象方法,违反函数式接口规则。
立即学习“Java免费学习笔记(深入)”;
实际写法示例
下面这个接口完全合法:
@FunctionalInterface
interface Processor {
void process(String input);
// 允许:Object 的 public 方法,不计入抽象方法数量
boolean equals(Object obj);
int hashCode();
String toString();
}
它仍满足函数式接口定义——真正需要被实现的,只有 process 这一个抽象方法。
默认方法和静态方法也允许
除了 Object 的 public 方法,函数式接口还可包含:
- 任意数量的
default方法(已有实现) - 任意数量的
static方法(通过接口名调用) - 但不能有第二个非
Object、非default、非static的抽象方法
@FunctionalInterface 注解只是编译检查提醒,不加它也不影响函数式接口的本质,只要语义符合即可。


















