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(); } }); }
其次,执行此操作会产生任何性能问题吗?
什么相比? 你需要为你的内部类提供字段或变量才能工作,副本是一种非常有效的方法。 它只是一个“浅”的副本:只复制(在你的例子中)环境的引用,而不是环境本身。