java - Java final 局部变量存储在哪里?

标签 java performance final local-variables

举个例子:

public void init() {
    final Environment env = new Environment();
    Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() {
             env.close();
        }
     });
}

首先,env 存储在哪里?是吗:

  • 由编译器复制到引用它的内部类的隐藏成员变量中
  • 复制并引用到堆上
  • 留在堆栈上并以某种方式在那里引用
  • 别的

我的猜测是第一个选项。

其次,解决由此产生的任何性能问题(而不是简单地将 env 创建为类的成员变量并照此引用它),尤其是在创建大量此类内部变量时引用最终局部变量的类构造。

最佳答案

是的,它们被复制了,这就是为什么你必须将变量声明为final。这样,可以保证它们在复制完成后不会更改。

这对于实例字段来说是不同的,即使不是最终的也可以访问。在这种情况下,内部类获取对其用于此目的的外部实例的引用。

private Environment env;  // a field does not have to be final

public void init() {
    Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() {
             env.close();
        }
     });
}

Secondly, do any performance issues that arise from doing this?

与什么相比?您需要让内部类工作的字段或变量,副本是一种非常有效的方法。无论如何,它只是一个“浅”副本:仅复制对(在您的示例中)环境的引用,而不是环境本身。

关于java - Java final 局部变量存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1945663/

相关文章:

java - 为什么内部类可以覆盖私有(private) final方法?

java - 如何在java中只设置变量一次

c++ - 如何诊断/分析瞬时性能命中,C++

即使#threads, requests/sec 很低,asp.net 请求也会排队

perl - 如何在Perl中制作 “final”方法?

java - 修改 jar 文件

java - Struts2配置理解

java - 在 javafx 中问题加载图像的相对路径

java - 将 Maven 项目转换为 Gradle

performance - 如果我使用多种字体,是否可以将 Google Web 字体减少到一个请求?