首先,如果这是一个重复的问题,我道歉。我发现很多类似的,但没有一个直接解决我的问题。
为了准备即将到来的考试,我在做一份过去的文章。它有一个问题,给出一个代码片段。我们必须声明它是否编译,如果没有编写第一个编译器错误发生的行,并解释它。这是代码段:
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 = …]。
我对匿名内部类的理解是他们可以访问:
>包含类的字段
>封装类的方法
>封闭范围的局部变量,前提是它们是最终的
那么我失踪了什么?根据我知道,这段代码不应该工作。