为什么我们使用带有匿名内部类的final关键字?

时间:2011-08-16 10:28:42

标签: java oop java-ee scjp

我正在准备S(O)CJP,塞拉利昂&贝茨预定。

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

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

我想在内部类中应该有这种最终局部变量的某种“复制”。由于价值无法改变,为什么不重复这些信息...... 有人可以证实这一点,或者告诉我,我是否遗漏了什么?

2 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:11)

编译器使用微妙的技巧复制封面下的最终引用,让内部类到达外部类的最后一个字段。复制是为什么字段必须是最终的,因此值不会改变。

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