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();

}

});

}

其次,这样做会引起性能问题吗?

比起什么?您需要具有字段或变量来使内部类工作,而复制是一种非常有效的方法。无论如何,它只是一个“浅”副本:仅复制对(在您的示例中)环境的引用,而不是环境本身。

以上是 Java最终局部变量存储在哪里? 的全部内容, 来源链接: utcz.com/qa/427878.html

回到顶部