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

24

我正在准备S(O)CJP考试,使用的教材是 Sierra & Bates。

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

众所周知,我们可以通过使用final关键字来绕开这个问题。这就是书中所说的,但他们并没有真正解释final关键字的作用... 据我所知,在方法局部变量上使用final关键字并不会使它存在于堆上...那么类如何能够访问仍然存在于堆栈上的final变量,而此时可能已经没有堆栈了???

我猜测应该有一种在内部类中“复制”此final局部变量的方法。既然值不会改变,为什么不复制这些信息...... 请问是否有人可以确认这一点或告诉我是否遗漏了什么?

2个回答

19

你的直觉是正确的,因为这个变量是final的,所以安全地将其复制是可行的。当然,对于引用类型,这意味着复制指向对象而不是对象本身的引用。


12

是的,即使它不是final,编译器仍然可以复制变量。我猜想要求它是final会使代码更明确,表明它不会改变。 - Steve Kuo
2
问题在于,据我理解,如果您不需要它是最终的,那么您需要更加小心地跟踪处理并在外部变量更改时进行更新。如果您有许多内部类实例,它们都需要更新怎么办? - Thorbjørn Ravn Andersen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接