Java停止对内部类中的非最终变量进行错误处理(Java 8)


问题内容

Java 7在以下代码上说:“无法引用封闭范围中定义的非最终局部变量消息”:

public class Runner {   
    public static void main(String[] args) {

        String message = "Hello world";

        new Runnable() {
            @Override
            public void run() {
                System.out.println(message);
            }
        }.run();
    }
}

Java 8没有。

怀疑这是关于向Java添加功能编程功能。

它是否类似地处理代码?


问题答案:

Java8隐式将message其定为final,因为它从未被修改。尝试在代码中的任何地方修改它,您将得到一个编译错误(因为这会删除隐式的final)。

这实际上称为 final
。引用文档

但是,从Java SE 8开始,本地类可以访问最终变量或有效最终变量的局部变量和封闭块的参数。变量或参数的值在初始化后从未更改,实际上是最终的。