【问题标题】:Scope of final local variable in javajava中最终局部变量的范围
【发布时间】:2012-05-27 01:16:12
【问题描述】:

方法局部内部类不能访问局部变量,因为方法局部内部类的实例在方法结束后可能仍然存在。但是一旦局部方法结束,局部变量就会消失。 我了解到方法局部内部类可以访问最终局部变量,这是否意味着最终局部变量在方法结束后仍然存在?

【问题讨论】:

  • 注意发布您的示例,以免有人意外误解您的问题?我们是编码员,Java 代码会更清楚地说明这一点。
  • 我想这就是你的意思,而 no 它不起作用。 ideone.com/LNg9w
  • @HunterMcMillen 问题是关于方法本地类,而不是其他方法。
  • 只有在方法完成后,如果它存储在构造的方法本地内部类中,它才有效。它当然不会,例如可用于该方法的未来运行。
  • @Jeffrey 好吧,我想这表明这个问题是多么令人困惑。完全错过了。

标签: java inner-classes final local-variables


【解决方案1】:

不,它没有。这意味着局部变量的副本仍然存在,在内部类实例中。 “最终”只是确保两个副本的价值不会混淆。

【讨论】:

    【解决方案2】:

    有点。 Java 匿名内部类的行为类似于“闭包”,也就是说,它们围绕当前本地状态“关闭”。然而,Java 只允许这些类围绕最终变量关闭。如果没有,变量的本地状态可能会改变,但内部类中保存的版本不会改变,因此它将访问“过期”实例。这可能会让程序员感到困惑。

    相反,Java 要求实例通过方法而不是变量重新分配来处理可变性。这会带来更好的清晰度并允许更简单的调试。有关 Java 为何这样做的更多信息,请参阅this answer

    由于该类仍然持有对变量的引用,因此您的问题的答案是,在内部类放弃对变量的所有权之前,该实例不会被垃圾回收。

    【讨论】:

    • “这可能会让程序员感到困惑。” - 更重要的是,它不再“像”闭包。您将拥有一个标识符名称,该标识符名称具有明显不同的绑定,具体取决于词法上下文。
    猜你喜欢
    • 2014-03-02
    • 1970-01-01
    • 2013-05-10
    • 2014-07-14
    • 2022-01-12
    • 2017-02-17
    • 2019-03-04
    • 2013-10-14
    • 2013-08-16
    相关资源
    最近更新 更多