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

Java匿名类引用实例变量更新未生效的原因解析(含笔误修正)

匿名类引用实例变量未更新的原因分析

问题本质

你遇到的核心问题是:调用setAdjustNum方法后,匿名内部类innerComp的compare方法始终输出adjustNum的初始值,根源是set方法中的**变量遮蔽(Variable Shadowing)**问题。

具体原因拆解

看修正前的setAdjustNum方法:

public void setAdjustNum(int adjustNum) {
    adjustNum = adjustNum;
}

这里的方法参数adjustNum和类的实例变量adjustNum同名,导致局部变量(方法参数)遮蔽了实例变量。执行adjustNum = adjustNum时,实际上只是把参数的值赋值给参数本身,完全没有修改到类的实例变量this.adjustNum。

而匿名内部类innerComp引用的是类的实例变量adjustNum,由于实例变量根本没被更新,所以compare方法自然一直输出初始值0。

修正后的逻辑验证

修正后的代码用this.adjustNum = adjustNum明确指定要修改的是类的实例变量:

public void setAdjustNum(int adjustNum) {
    this.adjustNum = adjustNum;
}

此时调用setAdjustNum(1)会真正更新实例变量,匿名内部类作为非静态内部类,默认持有外部类实例的引用,所以compare方法能读取到更新后的值1,输出结果符合预期。

补充说明

Java中,当局部变量(包括方法参数)和实例变量同名时,局部变量的优先级更高,会遮蔽实例变量。如果要访问实例变量,必须通过this.变量名明确指定。你的匿名内部类属于非静态内部类,它访问的adjustNum本质是外部类实例.this.adjustNum,只要实例变量被正确更新,匿名类就能获取到最新值。

内容的提问来源于stack exchange,提问作者Tel lui

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:12:45