为什么我们在匿名内部类中使用 final 关键字?

2022-09-01 20:55:45

我目前正在准备S(O)CJP,以及Sierra & Bates的书。

关于内部类(方法本地或匿名),他们说我们无法访问局部变量,因为它们位于堆栈上,而类位于堆上,并且可以由方法返回,然后尝试访问这些变量,这些变量位于堆栈上,但自方法结束以来不再存在...

众所周知,我们可以通过使用最终关键字来绕过它。这是他们在书中所说的,但他们并没有真正解释最终关键词的效果......据我所知,在方法局部变量上使用最终关键字并不能使其在堆上存活...那么,该类如何能够访问仍然存在于堆栈上的最终变量,而不可能再有堆栈???

我想在内部类中应该有这个最终局部变量的某种“副本”。既然值不能改变,为什么不复制这些信息呢?有人可以确认这一点或告诉我我是否错过了什么吗?


答案 1

你的直觉是正确的,因为变量是最终的,所以可以安全地复制它。当然,对于引用类型,这意味着将引用复制到对象,而不是它所引用的对象。


答案 2

编译器使用微妙的技巧将最终引用复制到封面下,以使内部类到达外部类中的最终字段。复制是字段必须是最终字段的原因,因此值不会更改。

例如,请参阅 http://tech-read.com/2008/06/19/why-inner-class-can-access-only-final-variable/