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
相关产品推荐
相关产品推荐

