java中类名::实例方法名表示对任意该类型对象调用该方法,隐式this为首个参数,需匹配函数式接口签名,如string::tolowercase对应function,string::startswith则需bipredicate。

Java 中通过类名直接引用“特定类型的任意对象实例方法”,本质是使用 引用类型::实例方法名 的语法,前提是该实例方法的签名与函数式接口的抽象方法兼容。它不绑定具体对象,而是把“调用者”作为隐式第一个参数(即 this),由后续实际调用时传入的对象决定。
核心写法:ClassType::instanceMethodName
这种写法表示:对任意一个 ClassType 类型的对象,调用其 instanceMethodName 方法。编译器会根据上下文(目标函数式接口)自动推断参数顺序和数量。
- 左边必须是明确的类名(或类型名),不能是变量或表达式
- 右边是该类中定义的**非静态、非 private** 实例方法名
- 方法签名需匹配函数式接口抽象方法:实例方法的第一个隐式参数
this对应函数式接口的第一个显式参数
典型场景:String::toLowerCase
例如 String::toLowerCase 是合法的方法引用:
-
String是类型名,toLowerCase()是无参实例方法 - 对应函数式接口如
Function<string string></string>:输入一个String对象,调用它的toLowerCase(),返回结果 - 实际执行时,JVM 把传入的
String实例作为this去调用其方法
注意参数位置的自动适配
以 String::startsWith 为例:
-
String.startsWith(String prefix)是一个带一个参数的实例方法 - 它可匹配
BiPredicate<string string></string>(两个参数)——因为this占第一个位置,prefix是第二个 - 也可匹配
Function<string boolean></string>?❌ 不行,因为该接口只接受一个参数,但startsWith需要this+prefix共两个“输入”,所以必须用双参数接口
常见错误与限制
以下写法不合法或不符合“任意对象”的语义:
-
obj::method—— 这是绑定到具体对象的引用,不是“任意对象” -
SomeClass::staticMethod—— 这是静态方法引用,不涉及实例 -
SomeClass::privateMethod—— 编译失败,无法访问 -
List::get单独使用 —— 需配合BiFunction<list integer e></list>等双参数接口才有效,不能用于单参数场景
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











