You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)


回答

  1. 实例方法与所属对象的引用关系:
    实例方法本身不会强引用所属对象。实例方法是类层面的定义,属于类的成员,不会持有任何具体实例的引用;只有当通过具体实例调用方法时,方法的执行上下文才会临时依赖该实例的引用,但这并非方法本身持有引用。

  2. myObject::someMethod形式的方法引用:
    这种实例方法引用会强引用myObject实例。创建该方法引用时,Java会生成一个对应函数式接口(比如这里的Runnable)的实现实例,该实例内部会持有myObject的强引用,确保调用方法时能访问到实例成员。

  3. 具体场景结论:
    只要TakesRunnable实例还未被垃圾回收,foo对象就不会被回收。因为TakesRunnable的runner变量持有了foo::runMe生成的Runnable实例,而该Runnable实例强引用着foo,这和Python中实例方法绑定对象的逻辑一致,和你倾向的结果相同。


内容的提问来源于stack exchange,提问作者Daniel Walker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 09:05:13