有关Java中本地最终变量的问题

我有以下代码:

public class BookLib {
    void f() {
        final int x = 5; // Line 1
        class MyCLass {
            void print() {
                System.out.println(x);
            }
        }
    }
}

我不明白为什么要在这种情况下使用final变量(第1行)?


你在这里创建了一个内部类。 由于此类的对象的生命周期可能远远大于方法调用的运行时间(即对象在方法返回后仍可能存在很长时间),因此它需要“保留”它的局部变量的状态可以访问。

通过在内部类中创建一个(不可见的,合成的)副本,并自动将所有对局部变量的引用替换为对该副本的引用来完成此保留。 当创建内部类对象后,局部变量被修改时,这可能会导致奇怪的效果。

为避免这种情况,需要以这种方式访问​​的所有局部变量都是final :这确保了局部变量只有一个可能的值,并且没有观察到不一致。

这个特定的规则可以在JLS的§8.1.3内部类和附件实例中找到:

任何使用但未在内部类中声明的局部变量,形式方法参数或异常处理程序参数都必须声明为final。 任何使用但未在内部类中声明的局部变量必须在内部类的主体之前明确赋值(第16节)。


在这里你创建一个内部类。 为了访问执行上下文,对变量的引用应保持不变,否则会出现错误行为。 为了保证这一点,你应该声明你的变量final:因此不能改变它。

在这里看到详细的解释


来自kathy sierra scjp书

该方法的局部变量存在于堆栈中,并且仅在该方法的生命周期中存在。 我们已经知道局部变量的范围仅限于声明变量的方法。当方法结束时,堆栈帧被吹走并且变量是历史记录。 但即使在方法完成之后,如果其中创建的内部类对象可能仍然存在于堆中,例如,对它的引用被传递到其他代码中,然后存储在实例变量中。 因为只要方法局部的内部类对象不存在局部变量,内部类对象就不能使用它们。 除非局部变量标记为最终!

链接地址: http://www.djcxy.com/p/82869.html

上一篇: Question about local final variable in Java

下一篇: How does Java manager the memory?