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

ipk*_*iss 8 java final

我有以下代码:

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

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

Joa*_*uer 20

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

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

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

此特定规则可在§8.1.3内部类和JLS的封闭实例中找到:

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

  • 我们在这里谈论的是什么奇怪的效果?最终变量是否未存储在堆栈框架中? (2认同)