当前位置: 首页 > 面试题库 >

变量在侦听器中应为最终变量

邢运良
2023-03-14
问题内容

在SO和google中寻找了这个问题的答案,但找不到任何答案。

我有以下代码

MyClass variable = new MyClass();
Button b = new Button();
b.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e){
         System.out.println("You clicked the button");
         variable.doSomething();
   }
});

编译器返回以下内容:

从内部类内部访问局部变量变量;需要宣布为最终

为什么variable必须最终决定的技术原因是什么?


问题答案:

这是因为您正在使用匿名内部类。发生的是编译器为您创建了类。它将其称为您的外部类,并添加$和编号,例如$$2等等。

该类具有对自动初始化的外部类的引用,因此其实例可以使用外部类的方法和字段。

但是您的课程是匿名的。这样的内部方法定义,并且可以使用 这个匿名类之前定义的内部变量。问题是“它怎么做?”
确实,您不能引用“正在运行的方法实例”来访问其变量。答案是将从匿名内部类引用的所有方法变量都复制到匿名内部类。因此,变量必须是最终变量:否则,某些人可以从外部类更改其值,并且内部类看不到这些更改。



 类似资料:
  • 问题内容: 假设我使用statement定义了一些变量。代码运行时,变量的值会更改。 如何跟踪此变量的变化?我如何实现某些行为类似于onSomeVariableChangedListener的侦听器? 我还需要知道何时在一个页面中执行了其他方法,以便可以在另一个类中设置侦听器。 问题答案: 这是将变量隐藏在 setter / getter 对后面的众多原因之一。然后,在设置器中,您可以通知您的侦听

  • 问题内容: 我读了这个问题不可变对象,并留下了关于不可变对象,并最终场一个问题: 为什么我们需要不可变类中的实例变量为最终变量? 例如,考虑以下不可变的类: 如果在上面的代码中没有set方法,而实例变量仅在构造函数中设置,为什么要求将实例变量声明为final? 问题答案: 有没有 要求 这样做的变量。但是,当您确实明确打算永远不更改变量时,通常这样做是一种好习惯,因为这不仅可以使变量避免错别字或其

  • 问题内容: 这个问题已经在这里有了答案 : 为什么在匿名类中只能访问最终变量? (15个答案) 为什么实例变量“忽略Lambda表达式中使用的变量必须是最终变量或实际上是最终变量”警告[重复] (2个答案) Lambdas:局部变量不需要最终变量,实例变量不需要 (10个答案) 2年前关闭。 当我编写此代码时,我收到一个编译时错误,该错误是: “ lambda中的变量必须是final或有效的fin

  • 是否有一种方法来构建侦听器,以检测日期是否仍被传输到变量,如果是,则做一件事,当不做另一件事? 例如 直到“int counter1”增加设置布尔值(true)或打印或更改另一个int值为1 int计数器(不再增加或减少),设置布尔值(false),打印不同的东西,改变另一个int为2。 基本上变量改变加或减,做一件事停止改变,做另一件事重新开始改变,回去做第一件事等。 有办法做到这一点吗?没有明

  • 在Java8中,Java设计者提出了一个有效的final变量的概念,即一个如果被“final”追加就不会给编译器带来错误的变量。我的问题是,这个新提出的“有效最终”概念比经典的“最终”提供了什么?作为一名Java开发人员,我实际上得到了什么好处?

  • 问题内容: 这只是我的代码的一个示例。现在,如果我在onDataChange中打印出userName变量,它可以正常工作。但是,如果我尝试在外部侦听userName,则在侦听器之后将输出’null’。如何在onDataChange()中将变量与所需数据一起存储? 编辑/更新:因此,在我进行一个处理之前,该处理将采用被监听的值并对其进行处理。我只是对该过程进行了一些调整,并将其添加到onDataCh