局部内部类与匿名内部类访问局部变量有何限制?

152 阅读2分钟

程序员冈刀,目前就职于美团,java开发工程师,研究生。2022年,毕业于北京邮电大学电子工程学院、电子与通信工程专业。个人公众号《代码废柴》欢迎关注。


最近看到一个问题问题,为什么局部内部类和匿名内部类只能访问final的局部变量?下面一起看一下java对象值的使用限定问题。
问题一:内部类中可以直接调用外部类中的属性和方法,但是当外部类的方法结束后,局部变量就会被销毁了,内部类就会访问一个不存在的变量。为了解决这个问题,就把局部变量复制一份作为内部类的成员变量,这样当前面的局部变量死亡后,内部类仍然可以访问它,实际访问的是局部变量复制的版本数据。这样就好像使用的内部类延长了方法中的局部变量的使用生命周期。

问题二:将局部变量复制成内部类的成员变量的时候,必须保证这两个变量的值是一样的,换句话说,如果在内部类修改成员变量,方法中的局部变量也会跟着它的修改而变化,但是将局部变量设置为final的时候,针对它进行初始化后,就不会让在内部类对这个变量进行修改了,从而保证内部类的成员变量和方法中的局部变量是一致的。其实,这也是一种妥协。

总结:为了实现在内部类运行期间,局部变量的值一直可以使用,并且内部类不可以修改方法中的局部变量这2个问题做出的约定。这种约定可以让java程序可以正确地输出想要的结果。同时也不会出现,内部类找不到局部变量值的情况,不会出现无法运行的结果,java做出的这样的一种妥协约定!


红色的地方属于一个匿名内部类

image.png

提示需要应为final的变量 image.png

正确的写法

image.png


程序员冈刀,目前就职于美团,java开发工程师,研究生。2022年,毕业于北京邮电大学电子工程学院、电子与通信工程专业。个人公众号《代码废柴》欢迎关注。

个人公众号