为了账号安全,请及时绑定邮箱和手机立即绑定

使用对象状态调用方法的消费者

使用对象状态调用方法的消费者

繁花如伊 2021-06-21 11:15:31
我有一堂课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 节)更复杂。当方法引用表达式在 :: 分隔符之前有一个表达式(而不是一个类型)时,该子表达式会被立即求值。求值结果一直保存到对应的功能接口类型的方法被调用;此时,结果将用作调用的目标引用。这意味着 :: 分隔符之前的表达式仅在程序遇到方法引用表达式时才计算,并且不会在功能接口类型的后续调用中重新计算。


查看完整回答
反对 回复 2021-06-23
  • 1 回答
  • 0 关注
  • 83 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信