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

我有一堂课


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实例。消费者是否保留对原始对象的引用或创建一个新实例,如果它是垃圾收集时相同的引用?


繁花如伊
浏览 89回答 1
1回答

慕无忌1623718

Java 使用按值传递。所以,&nbsp;test2和&nbsp;hello只是一个参考副本。您仍然保留要参考的信息。消费者是否保留对原始对象的引用?是的。作为附加知识,JLS 第 15.13.3 节描述了方法引用的运行时评估。方法引用表达式评估的时间比 lambda 表达式(第 15.27.4 节)更复杂。当方法引用表达式在 :: 分隔符之前有一个表达式(而不是一个类型)时,该子表达式会被立即求值。求值的结果一直保存到对应的功能接口类型的方法被调用;此时,结果将用作调用的目标引用。这意味着 :: 分隔符之前的表达式仅在程序遇到方法引用表达式时才计算,并且不会在功能接口类型的后续调用中重新计算。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java