24

我目前正在准备 S(O)CJP 和 Sierra & Bates 的书。

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

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

我想内部类中应该有这个最终局部变量的某种“副本”。既然值不能改变,为什么不复制这个信息......有人可以确认一下或者告诉我我是否遗漏了什么?

4

2 回答 2

19

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

于 2011-08-16T10:32:38.073 回答
12

编译器使用微妙的技巧在幕后复制最终引用,以让内部类到达外部类中的最终字段。复制就是为什么该字段必须是最终的,因此值不会改变。

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

于 2011-08-16T10:40:43.287 回答