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

在Java内部类中访问变量

罗波鸿
2023-03-14
问题内容

我正在尝试创建一个JLabel数组,当单击它们时,所有这些标签都应该变为不可见。当试图通过需要访问用于声明标签的循环的迭代变量的内部类设置鼠标侦听器时,就会出现问题。代码是不言自明的:

    for(int i=1; i<label.length; i++) {
       label[i] = new JLabel("label " + i);
       label[i].addMouseListener(new MouseAdapter() {
          public void mouseClicked(MouseEvent me) {
             label[i].setVisible(false);   // compilation error here
          }
       });
       cpane.add(label[i]);
    }

我以为我可以通过使用内部方法中的(thissuper代替)label[i]内部调用来克服此问题,但我一直无法弄清楚。

编译错误是:从内部类内部访问局部变量i;需要宣布为最终`

我敢肯定,答案一定是我从未想过的愚蠢之举,或者我犯了一些小错误。

任何帮助,将不胜感激


问题答案:

必须final从内部(和匿名)类访问您的局部变量。

您可以为以下代码更改代码:

for (int i = 1; i < label.length; i++) {
    final JLabel currentLabel =new JLabel("label " + i); 
    currentLabel.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent me) {
            currentLabel.setVisible(false);   // No more compilation error here
        }
    });
    label[i] = currentLabel;
}

从JLS:

必须声明使用但未在内部类中声明的任何局部变量,形式参数或异常参数final

内部类中使用但未声明的任何局部变量必须在内部类主体之前明确分配(第16节)。

资源:

  • JLS-内部类和封闭实例


 类似资料:
  • 问题内容: 在内部类中,可以访问外部类的变量,但不能访问方法的局部变量。我了解了无法访问方法的局部变量的部分,但我想知道为什么外部类变量可以访问? 我的理解是,由于内部类与外部类绑定,因此只要父级可用,子级就可以访问其父级变量。我对么? 问题答案: 假设您的外部类在内部类的范围内(非静态)被称为,以获取该字段。 例如, 其中Outer是类的名称,并标识该字段。 您也可以直接抓取它,但是如果由于阴影

  • 在内部类中,外部类的变量是可访问的,但方法的局部变量不是。我理解了关于方法的局部变量不可访问的部分,但我想知道为什么外部类变量是可访问的? 我的理解是,由于内部类与外部类绑定,因此只要父类可用,子类就可以访问其父变量。我说得对吗?

  • 问题内容: 我有一个整数数组。 我想为每个X创建一个沿Y迭代的线程。我不知道如何将适当的X值传递给每个线程。 本质上我希望能够做到 任何帮助,将不胜感激 问题答案: 只值可以的方法和本地匿名内部类内被捕获。您需要按以下方式更改代码:

  • 我有以下几种: 我想调用倒计时方法: 不同物品约10次 方法: 如果调用此方法,则会出现错误: 变量从内部类中访问 我不想将变量设置为final,因为我必须在方法中编辑这些变量。我能做些什么呢?谢谢

  • 问题内容: 我想使用a 对图进行拓扑排序。为简便起见,我想为比较器使用匿名内部类。但是,我需要访问该图才能确定我正在查看的节点的程度。这可能吗? 正确的代码 问题答案: 是的,使其最终化: 有关最终关键字,请参见最终词: 匿名本地课程 第二种情况涉及最终变量,实际上是语言语义所规定的。在这种情况下,除非声明为final,否则Java编译器将不允许您使用变量。这种情况出现在闭包(也称为匿名本地类)中

  • 问题内容: 因此标题说明了一切。我的内出现编译错误。 这是代码。 问题答案: 如果您不想使其最终确定,则始终可以将其设为全局变量。