Java最终局部变量存储在哪里?
以以下为例:Java最终局部变量存储在哪里?,java,performance,final,local-variables,Java,Performance,Final,Local Variables,以以下为例: public void init() { final Environment env = new Environment(); Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { env.close(); } }); } 首先,env存储在哪里?是: 由编译器复制到引用它的内部类的隐藏成员变量中 复制到堆
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();
}
});
}
其次,这样做是否会产生任何性能问题
和什么相比?为了让内部类工作,需要有字段或变量,而副本是一种非常有效的方法。无论如何,它只是一个“浅”复制:只复制了对(在您的示例中)环境的引用,而不是环境本身。因此,我可以假设这样做不会产生性能问题吗?我个人在这方面的不满是对外部实例的引用(用于访问复制的字段,而不是变量)如果不需要,可能会有问题:与将其作为成员变量引用相比。如果它是复制的,那么,我的假设是没有性能影响。是的,它是相同的(只是打字更少),事实上,由于您在幕后引用了编译器在内部类中为您创建的合成成员变量,以保存最终变量的副本。如果您添加了使您相信这一点的引用或工作,您将获得我的upvote。