【发布时间】:2015-07-20 10:17:00
【问题描述】:
首先,如果这是一个重复的问题,我深表歉意。我发现了很多类似的,但没有一个能直接解决我的问题。
为了准备即将到来的考试,我正在做一份过去的论文。它有一个给出代码sn-p的问题。我们必须说明它是否编译,如果没有,写出第一个编译器错误发生的那一行并解释它。这是sn-p:
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:未解决的编译问题: 无法引用封闭范围内定义的非最终局部变量 jtf
我做了一些搜索,发现 Eclipse 使用它自己的 Java 编译器版本。所以我在 Eclipse 之外重新制作了文件并通过命令行编译/运行它。它编译时没有错误或警告,当鼠标悬停在文本字段上时,显示所需的java.awt.Point[x=...,y=...]。
我对匿名内部类的理解是可以访问:
- 封闭类的字段
- 封闭类的方法
- 封闭范围的局部变量,只要它们是
final
那么我错过了什么?据我所知,这段代码应该不起作用。
【问题讨论】:
标签: java java-8 inner-classes