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

Java 8中内部类能否引用外部类的非final变量?

为什么这段代码里内部类能访问非final变量?

你的疑惑分两种情况,咱们拆开说:

1. 关于外部类成员变量greeting

greeting是外部类Outer的成员变量,不是方法里的局部变量。局部内部类(就是你代码里的Inner)本来就可以直接访问外部类的所有成员,不管是不是final——因为内部类实例默认持有外部类实例的引用,它访问的是外部类对象的实时成员值,所以哪怕你在main里修改了greeting的值,内部类也能拿到最新的结果。

2. 关于方法参数s

你之前的认知是Java早期版本的规则:Java 8之前,局部内部类访问方法里的局部变量或参数时,必须声明为final。但Java 8引入了**effectively final(实际终态)**的概念——只要变量在初始化后没有被修改过,编译器就会把它当作final处理,允许内部类访问。

看你代码里的s,作为doWork的方法参数,在方法内部从来没有被重新赋值过,完全符合effectively final的条件,所以编译器不会报错,允许Inner类访问它。要是你尝试在doWork里给s重新赋值(比如加一行s = "new value";),编译器立刻就会报错,因为这时候s不再是effectively final了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:11:08