我目前正在准备S(O)CJP,与塞拉利昂&贝茨的书。为什么我们对匿名内部类使用final关键字?
关于内部类(方法本地或匿名),他们说我们不能访问局部变量,因为他们住在堆栈上,而类在堆上,并且可以通过方法返回,然后尝试拥有访问这些变量是在栈中,但由于该方法已经结束不存在了......
正如我们都知道,我们可以用final关键字绕过这一点。这是他们在书中所说的,但他们并没有真正解释最终关键字的效果是什么...... 据我所知,在局部变量的方法上使用final关键字并不会使它生活在堆上...那么这个类如何能够访问仍然存在于堆栈上的最终变量,而不会有更多的堆栈?
我想应该有某种内部类中这最后的局部变量的“复制”。由于价值不能改变,为什么不重复这个信息... 有人可以证实这一点,或告诉我,如果我失去了什么?
是的,但是编译器仍然可以复制变量,即使它不是最终的。我的猜测是要求它是最终的,这使得代码更加明确,不会改变。 –
根据我的理解,问题是,如果您不要求它是最终的,则需要更加谨慎地处理此问题,并在外部变量发生更改时进行更新。如果你有很多内部类的实例,他们都需要更新呢? –