【问题标题】:Java: Why could I access a local variable JPanel without final inside the anymous class? [duplicate]Java:为什么我可以在 anymous 类中访问没有 final 的局部变量 JPanel? [复制]
【发布时间】:2020-03-21 14:16:00
【问题描述】:

假设代码是:

public class Test {
    public void test() {
        JPanel panel = new JPanel();
        int a;
        JLabel label = new JLabel();
        label.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                panel.setBackground(Color.BLACK); // Correct
                a = 0; // Wrong, should be final
            }
        });
    }
}

我很困惑,为什么我可以在没有final 的情况下访问JPanel

【问题讨论】:

  • @Eran 感谢您的通知,我已经更改了代码。

标签: java swing


【解决方案1】:

从 lambda(或匿名类)访问的任何引用(或变量)都应该是 final实际上是 final,这取决于在您正在处理的 Java 版本上:

  • 在Java 8 之前,final 关键字是必须的;
  • Java 8 开始,只要初始化一次就足够了,引用被视为有效的最终版本;

这两个概念都代表您不能从 lambda 重新分配值。

以下是有关此问题的相关主题:

【讨论】:

    【解决方案2】:

    声明

    panel.setBackground(Color.BLACK);
    

    不给局部变量赋值(在匿名类方法中是不允许的)。它会改变panel 变量引用的实例的状态,这是允许的。

    声明

    a = 0; 
    

    试图为局部变量分配一个新值是不允许的。

    【讨论】:

      猜你喜欢
      • 2016-08-10
      • 2018-03-27
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 2015-02-17
      相关资源
      最近更新 更多