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

Seb*_*ber 23 java oop scjp java-ee

我正在准备S(O)CJP,以及Sierra和Bates的书.

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

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

我想在内部类中应该有这种最终局部变量的某种"复制".由于价值不能改变,为什么不重复这些信息...有人可以确认这个或告诉我,如果我错过了什么?

bra*_*ain 19

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


Tho*_*sen 12

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

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

  • 问题 - 根据我的理解 - 如果你不要求它是最终的,你需要更加仔细地跟踪处理这个问题,并在外部变量发生变化时进行更新.如果你有很多内部类的实例并且它们都需要更新怎么办? (2认同)