举个例子:
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/