Java最终局部变量存储在哪里?

Joe*_*oel 19 java performance final local-variables

请看以下示例:

public void init() {
    final Environment env = new Environment();
    Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() {
             env.close();
        }
     });
}
Run Code Online (Sandbox Code Playgroud)

首先,env存储在哪里?是吗:

  • 由编译器复制到引用它的内部类的隐藏成员变量中
  • 复制到堆上并在其上引用
  • 留在堆栈上,不知何故在那里引用
  • 别的

我的猜测是第一个选择.

其次,执行这样做会产生任何性能问题(而不是简单地创建env类的成员变量并引用它),特别是如果要创建大量引用最终局部变量的内部类构造.

Thi*_*ilo 19

是的,它们被复制,这就是你必须将变量声明为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();
        }
     });
}
Run Code Online (Sandbox Code Playgroud)

其次,执行此操作会产生任何性能问题吗?

相比什么?你需要为你的内部类提供字段或变量才能工作,副本是一种非常有效的方法.它只是一个"浅"的副本:只复制(在你的例子中)环境的引用,而不是环境本身.

  • 如果您添加一个让您相信的参考或作品,您将得到我的upvote. (2认同)