实例方法引用语法为“对象名::实例方法名”,将已有对象绑定为调用者,要求对象非null且方法签名与函数式接口兼容;如list::add可作为consumer使用,每次调用均以list为this执行add。

Java 中实例方法引用将对象作为调用者,本质是“把某个已有对象的某个实例方法‘绑定’到函数式接口上”,后续调用该函数式接口时,就自动以该对象为 this 调用对应方法。
语法:对象名::实例方法名
这是最直接的方式。前提是对象已经存在(不是 new 出来的临时对象),且方法签名与目标函数式接口的抽象方法兼容。
- 左边是**已创建的具体对象引用**(如
str、list、user) - 右边是该对象所属类中定义的**无参数或参数匹配的实例方法名**(不带括号)
- JVM 在底层会把该对象“捕获”进方法引用,相当于预设了调用主体
典型例子:String 的实例方法引用
比如想用 String::isEmpty 作为 Predicate<string></string>:
String str = "hello"; Predicate<string> pred = str::isEmpty; // ❌ 错误!类型不匹配 // str::isEmpty 是 String 实例方法,但它的签名是 () → boolean, // 而 Predicate<string> 的 test 方法是 (String) → boolean, // 所以不能用 str::isEmpty,而应该用 String::isEmpty(类名引用)</string></string>
正确做法是:若要让某个具体对象当调用者,常用于参数为 void 或与函数式接口入参一致的场景。例如:
List<string> list = new ArrayList();
// 想把 list 对象的 add 方法(String → boolean)当作 Consumer<string> 使用:
Consumer<string> adder = list::add; // ✅ 正确
adder.accept("apple"); // 等价于 list.add("apple")</string></string></string>
和类名引用(ClassName::instanceMethod)的区别
容易混淆的是:String::length 是类名引用,它代表“对任意 String 对象调用 length()”,调用时传入的参数就是那个对象;而 str::length 是对象引用,它固定以 str 为调用者,不能再换对象。
-
String::length→ 类型是ToIntFunction<string></string>,接受一个 String,返回其长度 -
str::length→ 类型是IntSupplier(无参数),每次调用都返回str.length(),无法传入其他字符串
注意事项
- 对象必须非 null,否则运行时抛
NullPointerException - 方法引用在创建时就绑定了对象状态,如果对象后续被修改(如 list 添加了元素),方法引用调用时反映的是最新状态
- 不能用于需要动态切换调用者的场景;若需灵活指定,应改用 lambda 表达式,如
s -> s.trim()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











