【问题标题】:Why do we use final keyword with anonymous inner classes?为什么我们在匿名内部类中使用 final 关键字?
【发布时间】:2011-08-16 10:28:42
【问题描述】:

我目前正在准备 S(O)CJP,以及 Sierra 和 Bates 书。

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

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

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

【问题讨论】:

    标签: java oop jakarta-ee scjp


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 是的,但编译器仍然可以复制变量,即使它不是最终的。我的猜测是,要求它是最终的会使代码更加明确,它不会改变。
      • 问题 - 据我了解 - 如果你不要求它是最终的,你需要更仔细地跟踪处理这个问题并在外部变量发生变化时进行更新。如果您有大量内部类实例并且都需要更新,该怎么办?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多