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 finalpublic void init() {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
env.close();
}
});
}
其次,这样做会引起性能问题吗?
比起什么?您需要具有字段或变量来使内部类工作,而复制是一种非常有效的方法。无论如何,它只是一个“浅”副本:仅复制对(在您的示例中)环境的引用,而不是环境本身。
以上是 Java最终局部变量存储在哪里? 的全部内容, 来源链接: utcz.com/qa/427878.html