2011-08-16 118 views
23

我目前正在准备S(O)CJP,与塞拉利昂&贝茨的书。为什么我们对匿名内部类使用final关键字?

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

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

我想应该有某种内部类中这最后的局部变量的“复制”。由于价值不能改变,为什么不重复这个信息... 有人可以证实这一点,或告诉我,如果我失去了什么?

回答

18

你的直觉是正确的,因为变量是最终它是安全的,做它的一个副本。当然对于引用类型来说,这意味着将引用复制到对象而不是它引用的对象。

11

编译器使用微妙弄虚作假复制幕后最终参考,让内部类进入决赛场在外部类。复制是为什么字段必须是最终的,所以值不会改变。

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

+0

是的,但是编译器仍然可以复制变量,即使它不是最终的。我的猜测是要求它是最终的,这使得代码更加明确,不会改变。 –

+2

根据我的理解,问题是,如果您不要求它是最终的,则需要更加谨慎地处理此问题,并在外部变量发生更改时进行更新。如果你有很多内部类的实例,他们都需要更新呢? –

相关问题