【问题标题】:Java 8 - Object method reference executes method of null reference [duplicate]Java 8 - 对象方法引用执行空引用的方法[重复]
【发布时间】:2020-04-26 06:07:28
【问题描述】:

请在下面查看我的代码。我有一个带有方法的功能接口 IFace。我正在使用来自 Test 的类实例的方法引用创建一个实现。谁能告诉我即使引用无效,接口仍然如何引用实例方法?还是引用改变了...?

public class Test {
    private int intVar;

    public Test() {
        intVar = 123;
    }

    public Test(int intVar) {
        this.intVar = intVar;
    }

    public void myInstanceMethod() {
        System.out.println("Hello from instance: " + intVar);
    }

    public static void main(String[] args) {
        Test t = new Test();

        IFace i = t::myInstanceMethod;
        i.method();  // Hello from instance: 123

        t = null; // Nullifying the reference
        i.method(); //  Hello from instance: 123
                    // Why still executing the method if reference is nullified?????

        t = new Test(456);
        i.method(); // Hello from instance: 123
                    // Why not Hello from instance: 456 ??????
    }

    static interface IFace {
        void method();
    }
}

【问题讨论】:

  • 你可以检查t==i是否(指向同一个地址空间),如果不是那么一切都好,如果是那么它是一个问题,快乐学习。另请注意:对象地址空间与引用变量的地址空间不同。
  • t = null; 不影响 i。
  • t 和 i 的字符串表示 com.test.javaadvanced.Test@1218025c com.test.javaadvanced.Test$$Lambda$1/531885035@816f27d
  • t = null;t = new Test(456); 永远不会在您的代码中再次使用。您使用已分配捕获值的i

标签: java java-8 method-reference


【解决方案1】:

从某种意义上说,这个问题类似于问为什么在下面的程序中打印b不输出null

String a = "abc";
String b = a;
a = null;

System.out.println(b);

IFace i = t::myInstanceMethod; 完成运行时,i 已经捕获了对此时t 指向的对象的引用。该引用独立于变量 t。看它像i,方法引用,有自己的变量指向同一个对象。

【讨论】:

  • 这种情况下如何调试代码?如果是复制/克隆对象,方法引用会破坏单例特性吗?
  • @Coder 不确定你的意思。要回答您的问题,您只需要了解一件事:Java 中如何管理对象和变量。创建对象时(如new Test()),可以有一个或多个变量指向它(如ti 中管理的变量)。如果这些变量之一被重新分配给不同的对象,那么最初指向同一对象的所有变量都不会这样做。
【解决方案2】:

当您取消引用时,内存不会被释放。当所有引用都消失时,它被释放。通过传递方法引用,您创建了对对象本身的新引用,因此此时引用计数为 2,即 i 在下面持有对 t 的引用

【讨论】:

  • 重要的一点 - 它可以在所有引用都消失后被释放。
  • @FoggyDay 有资格被垃圾收集:-)
  • 在任何一种情况下:正确:“当您使引用无效时,内存没有被释放。错误:“当所有引用都消失时,它被释放”
猜你喜欢
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多