Java实例方法及方法引用是否强引用所属对象?
Java实例方法引用与对象强引用关系问题
问题
- 问题1:实例方法是否会强引用其所属对象?
- 问题2:
myObject::someMethod形式的方法引用是否会强引用myObject?
背景代码
class TakesRunnable { private Runnable runner; TakesRunnable(Runnable runner) { this.runner = runner; } public void run() { runner.run(); } } class Foo { public void runMe() { // 方法逻辑 } }
具体场景
实例化Foo对象,通过new TakesRunnable(foo::runMe)创建TakesRunnable实例,之后丢失foo的本地引用,此时foo会被垃圾回收吗?还是TakesRunnable对象会对foo保持强引用?(我倾向于后者,因常使用Python)
回答
实例方法与所属对象的引用关系:
实例方法本身不会强引用所属对象。实例方法是类层面的定义,属于类的成员,不会持有任何具体实例的引用;只有当通过具体实例调用方法时,方法的执行上下文才会临时依赖该实例的引用,但这并非方法本身持有引用。myObject::someMethod形式的方法引用:
这种实例方法引用会强引用myObject实例。创建该方法引用时,Java会生成一个对应函数式接口(比如这里的Runnable)的实现实例,该实例内部会持有myObject的强引用,确保调用方法时能访问到实例成员。具体场景结论:
只要TakesRunnable实例还未被垃圾回收,foo对象就不会被回收。因为TakesRunnable的runner变量持有了foo::runMe生成的Runnable实例,而该Runnable实例强引用着foo,这和Python中实例方法绑定对象的逻辑一致,和你倾向的结果相同。
内容的提问来源于stack exchange,提问作者Daniel Walker
相关产品推荐
相关产品推荐

