首先,如果这是一个重复的问题,我很抱歉。我发现了许多类似的问题,但没有直接回答我的问题。
为了准备即将到来的考试,我正在做一份过去的试卷。其中有一道题目给出了一段代码片段。我们必须判断它是否能够编译,如果不能,写出第一个编译器错误出现的行并解释它。这是代码片段:
public static void main(String[] args) {
JFrame f = new JFrame("hi");
JTextField jtf = new JTextField(50);
jtf.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseMoved(MouseEvent evt) {
jtf.setText(evt.getLocationOnScreen().toString());
}
});
f.add(jtf);
f.setVisible(true);
}
我原本以为这段代码会编译不通过,因为jtf
并没有被声明为final
。我在Eclipse中输入了上面的代码,并得到了预期的错误提示,但它却可以正常编译和运行。只有在鼠标悬停在JTextField
上方时,才会出现预期的错误信息:
java.lang.Error: Unresolved compilation problem: Cannot refer to the non-final local variable jtf defined in an enclosing scope
我进行了一些搜索,发现Eclipse使用自己的Java编译器版本。所以我在Eclipse之外重新创建了这个文件,并通过命令行进行了编译/运行。它没有出现任何错误或警告,并且当我将鼠标悬停在文本框上时,显示了所需的java.awt.Point[x=...,y=...]
。
我的理解是匿名内部类可以访问:
- 封闭类的字段
- 封闭类的方法
- 封闭作用域的局部变量,前提是它们是
final
那么我错在哪里了?根据我所知道的,这段代码不应该工作。