代码之家  ›  专栏  ›  技术社区  ›  Joel

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

  •  18
  • Joel  · 技术社区  · 15 年前

    举个例子:

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

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

    • 由编译器复制到引用它的内部类的隐藏成员变量中
    • 复制到堆并在堆上引用
    • 留在堆栈上,并以某种方式引用那里
    • 别的东西

    我的 猜测 是第一个选择。

    第二,做任何由这样做引起的性能问题(而不是简单地创建 埃恩 作为类的成员变量并引用它),尤其是在创建大量引用最终局部变量的此类内部类构造时。

    1 回复  |  直到 15 年前
        1
  •  18
  •   Thilo    15 年前

    是的,它们是被复制的,这就是为什么必须声明变量为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();
            }
         });
    }
    

    其次,这样做是否会导致性能问题?

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