一尘不染

为什么Java内部类需要“最终”外部实例变量?

java

final JTextField jtfContent = new JTextField();
btnOK.addActionListener(new java.awt.event.ActionListener(){
    public void actionPerformed(java.awt.event.ActionEvent event){
        jtfContent.setText("I am OK");
    }
} );

如果省略final,则会看到错误“ 无法在用其他方法定义的内部类中引用非最终变量jtfContent ”。

为什么匿名内部类必须要求外部类实例变量为final才能访问它?


阅读 316

收藏
2020-03-09

共1个答案

一尘不染

首先,让我们放松一下,请放下那把枪。

好。现在,语言坚持的原因是它作弊是为了让你的内部类函数可以访问他们渴望的局部变量。运行时复制本地执行上下文(以及其他适当的内容),因此它坚持要求你进行所有操作,final以使事情保持诚实。

如果不这样做,那么在构造对象之后但在内部类函数运行之前更改局部变量值的代码可能会令人困惑和奇怪。

这是围绕Java和“闭包”进行的许多讨论的精髓。

2020-03-09