类特定(绑定对象)的方法引用是指用“对象名::实例方法名”形式引用已存在对象的实例方法,如str::length;它隐式绑定this,要求函数式接口方法参数与实例方法签名兼容,且对象非null。

Java 中“类特定方法引用”其实是指 引用某个具体对象的实例方法,也就是“绑定对象的方法引用”,它和 Lambda 表达式在函数式接口场景下可以互换使用,但写法更简洁、语义更明确。
什么是类特定(绑定对象)的方法引用?
它形式为 对象名::实例方法名,比如 str::length、list::add。这里的 str 和 list 是**已经存在的具体对象**,方法调用时会固定作用于该对象,不需再传入接收者(即隐式绑定了 this)。
它适用于函数式接口的抽象方法参数列表与目标实例方法签名兼容的情况:函数式接口方法的第一个参数类型,应与该对象的运行时类型一致(或其父类/接口),后续参数则一一对应实例方法的参数。
典型使用场景和写法对比
假设有一个字符串对象 String s = "hello",想用它来实现 Supplier<integer></integer>(无参、返回 int)或 Function<string integer></string>(接收 String、返回 int)等接口:
立即学习“Java免费学习笔记(深入)”;
-
用 Lambda:
() -> s.length()或(t) -> s.compareTo(t) -
用方法引用(类特定):
s::length或s::compareTo
注意:s::compareTo 能匹配 Function<string integer></string>,因为 String.compareTo(String) 接收一个 String 参数并返回 int,和 Function.apply(T) 的签名一致。
关键限制和注意事项
- 对象必须已存在且非 null,否则运行时触发
NullPointerException - 不能用于静态方法——那是“类名::静态方法”;也不能用于未绑定的实例方法——那是“类名::实例方法”,属于“未绑定方法引用”,要求第一个参数是接收者
- 方法引用的目标方法必须可访问(public / protected / package-private 且同包 / private 且在内部类中合理使用)
- 泛型推断可能失败,必要时需显式指定函数式接口类型,例如:
Function<string integer> f = s::compareTo;</string>
一个完整可运行例子
String greeting = "Hi"; // 等价写法: Supplier<Integer> len1 = () -> greeting.length(); // Lambda Supplier<Integer> len2 = greeting::length; // 方法引用(类特定) List<String> list = new ArrayList<>(); Consumer<String> adder1 = s -> list.add(s); // Lambda Consumer<String> adder2 = list::add; // 方法引用(类特定)
两者编译后字节码行为一致,JVM 会做类似优化。选择方法引用主要为了提升可读性与表达意图——明确表示“就是对这个对象做这个操作”。


















