Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java最终局部变量存储在哪里?_Java_Performance_Final_Local Variables - Fatal编程技术网

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。