我原以为我知道这个答案,但是搜了一个小时左右也没找到确认的资料。
在这段代码中:
public class Outer {
// other code
private void method1() {
final SomeObject obj1 = new SomeObject(...);
final SomeObject obj2 = new SomeObject(...);
someManager.registerCallback(new SomeCallbackClass() {
@Override
public void onEvent() {
System.out.println(obj1.getName());
}
});
}
}
假设registerCallback
将其参数保存在某个地方,以便匿名子类的对象可以存在一段时间。显然,该对象必须维护对obj1
的引用,以便在调用onEvent
时正常工作。
但是,考虑到该对象不使用obj2
,它是否仍然保持对obj2
的引用,以使得obj2
在对象存活期间无法被垃圾回收?我认为所有可见的final
(或有效的 final)本地变量和参数都会被捕获,因此只要对象存活就不能被GC回收,但我找不到任何一个说法能证实这一点。
这是实现相关的吗?
JLS中是否有解答这个问题的章节?我在那里找不到答案。
obj2
绑定到了callback$x
?你在字节码中看到了吗? - Antoniossssobj2
,但是也没有任何理由不这样做。" - Andy Turnerobj2
的一个很好的理由是,你可以在一个方法中声明多个匿名类:其中一个类可能只引用obj1
,而另一个类可能只引用obj2
。让两个类都捕获两个变量是不明智的。 - Andy Turner