Java最终局部变量存储在哪里?

时间:2009-12-22 11:02:01

标签: 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创建为类的成员变量并将其作为引用),特别是如果要创建大量此类内部类构造,引用最终局部变量。

1 个答案:

答案 0 :(得分:18)

是的,它们被复制,这就是你必须将变量声明为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();
        }
     });
}
  

其次,执行此操作会产生任何性能问题吗?

相比什么?你需要为你的内部类提供字段或变量才能工作,副本是一种非常有效的方法。它只是一个“浅”的副本:只复制(在你的例子中)环境的引用,而不是环境本身。