java - 为什么Java内部类需要 "final"外部实例变量?

标签 java inner-classes

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/

相关文章:

java - 线程池、共享数据、Java同步

java - 为什么我无法通过实例访问静态内部类

java - 音频可以在静态嵌套类中实现吗?

c++ - 友元和私有(private)嵌套类继承

java - 需要在 Hibernate 中的@Formula 注释中使用表别名

java - 如何在java中将不同货币的货币表示形式转换为十进制值

java - 将外部 jar (lib/*.jar) 添加到 IntelliJ IDEA 项目的正确方法

java - 如何使用 JOOQ 创建架构?

java - java中的空匿名内部类

java - 静态/非静态内部类 : The type parameter T is hiding the type T