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

采用以下示例:

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(); } }); } 

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

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