如果父 class 不是,是否可以对 java 8 方法引用进行垃圾回收?

Can a java 8 method reference be garbage collected if the parent class isn't?

如果我有

public interface Foo {
    public void oneMethod();
}

然后我还有一个class:

public class TestClass {

    SoftReference sr;

    public test() {
        doSomething(this::lalala);
    }

    public lalala() {

    }

    public doSomethingFoo(Foo foo) {
      sr = new SoftReference(foo);
      //can sr.get() ever return null?
    }
}

sr.get() 可以 return 为空吗?

也有兴趣了解在我们使用匿名内部 class 或非静态内部 class.

而不是方法引用的情况下的行为

为方法引用创建的实例的生命周期不依赖于方法引用的目标。它总是反过来,如果你的方法引用针对一个特定的实例,只要方法引用实例是可访问的,目标实例就不能被垃圾收集。

由于 Java 规范公开了如何创建和重用 lambda 表达式和方法引用的实例,因此也未指定它们将存在多长时间(参见 A:Does a lambda expression create an object on the heap every time it's executed?)。

实际上,在当前的实现中,不捕获任何值的实例会被记住和重用,因此与创建它们的 class 一样长。相比之下,捕获值的实例,并且 this::lalala 捕获 this 引用的值,不会被重用,一旦它们变得无法访问,就会被垃圾收集。