为什么我不能在不同方法中定义的内部类中引用非final变量?

mok*_*mok 2 java final inner-classes

为什么我不能在不同方法中定义的内部类中引用非final变量?
我已经看过关于这方面的主题,并且大多数人都说你的组件应该是最终的...... 但没人说为什么?!! 我不知道这种限制背后的哲学是什么.
令我困惑的是,以下代码是错误的:

JButton removeJBtn = new JButton("Remove");
    JButton addJBtn = new JButton("Add");
    //...
    btnNewButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            removeJBtn.disable();//Error here,Cannot ...


        }
    });
Run Code Online (Sandbox Code Playgroud)

而如果我定义

 JButton removeJBtn
Run Code Online (Sandbox Code Playgroud)

作为成员字段(在类的主体中,而不是方法),不需要将其定义为final!


我真的很感激我(也可能是许多其他人)总是面临的每日限制的任何合理答案.


亲爱的用户将此问题标记为重复,请至少提供原始问题的参考(已经得到肯定答复!),在我的问题上面添加了一个链接,我已经仔细阅读但是它充满了矛盾,一些人(88票)表示java捕获了最终变量的值,并且完全被它下面的评论(16票)拒绝.

Tou*_*one 9

方法的局部变量存在于堆栈中,并且仅在方法的生命周期中存在.您已经知道局部变量的范围仅限于声明变量的方法.当方法结束时,堆栈帧被吹走,变量是历史记录.但即使在方法完成之后,在其中创建的内部类对象仍可能在堆上存活,例如,如果对它的引用被传递到其他代码中,然后存储在实例变量中.因为只要方法本地内部类对象,局部变量不能保证存活,内部类对象不能使用它们.除非局部变量标记为final!

资料来源:Kathy Sierra SCJP