“类名::方法名”是定义模板行为而非绑定具体对象,编译器根据函数式接口参数自动分配接收者:第一个参数作调用实例,其余为方法参数,如string::comparetoignorecase对应bifunction,实现a.comparetoignorecase(b)。

“类名::方法名”这种写法,指的不是调用某个具体对象的方法,而是告诉编译器:**当需要一个函数式接口时,请把传入的第一个参数当作该类的实例,再用它去调用这个实例方法,其余参数依次往后传**。
关键在于“谁来调用”和“参数怎么分
它不绑定具体对象,而是依赖上下文自动分配接收者(receiver)。比如:
-
String::compareToIgnoreCase 对应的函数式接口是
BiFunction<string string integer></string>; 编译器会把第一个String当作调用方(即a.compareToIgnoreCase(b)中的a),第二个String当作参数(即b)。 -
String::length 对应的是
Function<string integer></string>; 只有一个参数,就直接把它当String实例,调用它的length()方法。 -
Object::toString 也对应
Function<object string></object>; 把传入的对象本身作为调用者,执行obj.toString()。
和“对象::方法名”的区别
这是最容易混淆的点:
-
str::toUpperCase ——
str是一个已创建好的具体对象,方法调用始终发生在它身上; -
String::toUpperCase —— 没有预设对象,每次调用时,由接口的参数决定“哪个字符串”来调用
toUpperCase()。
常见使用场景
这类引用主要出现在需要两个参数、且第一个参数恰好是方法所属类型的场合:
-
Arrays.sort(arr, String::compareToIgnoreCase)比较器接口Comparator<string></string>的抽象方法是int compare(T a, T b), 所以String::compareToIgnoreCase自动匹配为a.compareToIgnoreCase(b)。 -
list.sort(Comparator.comparing(Person::getName))这里Person::getName是Function<person string></person>, 表示“对每个 Person 对象,调用它的 getName() 方法”。
一句话总结
“类名::方法名”不是在找某个固定对象,而是在定义一种**模板行为**:拿到一个该类型的实例后,就用它去执行这个方法——具体是哪个实例,由调用时的参数动态决定。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











