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
,这样它就可以保持诚实。
如果它没有这样做,那么在构造对象之后但在内部类函数运行之前更改局部变量的值的代码可能会令人困惑和奇怪。
这是围绕 Java 和“闭包”的许多争论的本质。
<小时/>注意:开头段落是一个笑话,引用了 OP 原始作文中的一些全大写文本。
关于java - 为什么Java内部类需要 "final"外部实例变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27020150/