Java与Kotlin中this.member和this::member的区别及成员引用访问差异
this.member 与 this::member 的核心区别
二者本质是完全不同的两类语法,核心差异如下:
this.member是即时成员访问操作
无论Java还是Kotlin,该写法会直接读取当前实例member成员的当前值,如果member是方法则会当场执行并返回调用结果,不会产生额外的中间对象。this::member是成员引用生成操作
该写法不会当场访问成员值或执行方法,而是生成一个包装了当前实例和对应成员的引用对象,你可以把该对象存储、传递,在需要的时候再调用它获取最新成员值/执行方法。
代码示例参考:
// Java 示例 // 即时调用,直接拿到当前name值 String name = this.getName(); // 生成方法引用对象,不会执行getName Supplier<String> nameGetter = this::getName; // 后续调用才会执行方法,拿到最新的name值 String latestName = nameGetter.get();// Kotlin 示例 // 即时读取,拿到当前age值 val age = this.age // 生成属性引用对象,不会读取age val ageProp = this::age // 后续调用获取最新值,var属性还可以调用set方法修改值 val latestAge = ageProp.get() ageProp.set(25)
Kotlin 与 Java 成员引用的访问差异
两种语言的成员引用设计差异主要有以下几点:
- 支持的成员类型不同
Java仅支持方法引用、构造器引用,不支持直接引用类字段,要操作字段只能封装对应的get/set方法再生成方法引用。Kotlin同时支持属性引用、方法引用、构造器引用,还支持扩展函数/扩展属性的引用,属性引用自带get/set能力,不需要额外封装。 - 类型定位不同
Java的成员引用本质是函数式接口的语法糖,只能赋值给匹配签名的函数式接口变量,无法作为通用对象传递,也不能读取成员的元信息。Kotlin的成员引用是一等公民,本身就是KFunction/KProperty类型的对象,可以任意存储传递,还能直接拿到成员名、返回类型、注解等元信息。 - 语法灵活度不同
Kotlin中如果上下文可以明确当前实例,this::member可以省略this直接写为::member;Java的实例方法引用必须明确携带实例或类名,不支持省略this的简写。 - 未绑定引用的使用差异
两种语言都支持未绑定实例的类成员引用(比如User::getName),但Kotlin的未绑定引用可以直接作为接收者为对应类的函数使用,还支持和绑定引用的自动适配,灵活度远高于Java。
内容的提问来源于stack exchange,提问作者jklajkljl
相关产品推荐
相关产品推荐

