我有一堂课public final class GGGGG { private final String str; public GGGGG(final String str) { this.str = str; } public void showElement(final String test){ System.out.println(this.str+test); } public static void main(String[] args) { GGGGG hello = new GGGGG("hello"); final Test2 test2 = new Test2(hello::showElement); test2.test(); hello = null; test2.test(); } static class Test2{ private final Consumer<String> consumer; Test2(final Consumer<String> consumer) { this.consumer = consumer; } public void test(){ this.consumer.accept(" world"); } }}我不明白的是,在课堂上我有String str(状态)我用方法引用创建了一个消费者,showElement 现在这个消费者已经引用了GGGGG实例。消费者是否保留对原始对象的引用或创建一个新实例,如果它是垃圾收集时相同的引用?
1 回答
慕无忌1623718
TA贡献1744条经验 获得超4个赞
Java 使用按值传递。所以, test2
和 hello
只是一个参考副本。您仍然保留要参考的信息。
消费者是否保留对原始对象的引用?
是的。
作为附加知识,JLS 第 15.13.3 节描述了方法引用的运行时评估。
方法引用表达式评估的时间比 lambda 表达式(第 15.27.4 节)更复杂。当方法引用表达式在 :: 分隔符之前有一个表达式(而不是一个类型)时,该子表达式会被立即求值。求值的结果一直保存到对应的功能接口类型的方法被调用;此时,结果将用作调用的目标引用。这意味着 :: 分隔符之前的表达式仅在程序遇到方法引用表达式时才计算,并且不会在功能接口类型的后续调用中重新计算。
添加回答
举报
0/150
提交
取消