moa*_*fee 27 java inner-classes java-8
首先,如果这是一个重复的问题,我道歉.我找到了许多类似的,但没有一个直接解决我的问题.
为准备即将到来的考试,我正在做一篇过去的论文.它有一个提供代码段的问题.我们必须声明它是否编译,如果不编译,则写入发生第一个编译器错误的行并解释它.这是片段:
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);
}
Run Code Online (Sandbox Code Playgroud)
我期待它不要编译,因为jtf不是final.我通过在Eclipse中输入上面的代码测试了我的理论,它标记了预期的错误,但编译并运行得很好.只有在鼠标停留之后JTextField我才得到预期的错误:
java.lang.Error:未解决的编译问题:无法引用封闭范围中定义的非最终局部变量jtf
我做了一些搜索,发现Eclipse使用自己的Java编译器版本.所以我在Eclipse之外重新创建了文件,并通过命令行编译/运行它.它编译时没有错误或警告,当鼠标悬停在文本字段上时,显示所需的内容java.awt.Point[x=...,y=...].
我对匿名内部类的理解是他们可以访问:
final那我错过了什么?根据我的知识,这段代码不应该工作.
Ale*_* C. 33
我猜你正在使用Java 8进行编译.这里你的jtf变量实际上是最终的,所以编译得很好.如果变量初始化后它的值永远不会改变,那么变量实际上是最终的.
另请参见本地类:
但是,从Java SE 8开始,本地类可以访问最终或有效最终的封闭块的局部变量和参数.在初始化之后其值永远不会改变的变量或参数实际上是最终的.
和
像本地类一样,匿名类可以捕获变量; 它们对封闭范围的局部变量具有相同的访问权限:
匿名类可以访问其封闭类的成员.
匿名类无法访问其封闭范围中未声明为final或者有效final的局部变量.
[...]
如果您尝试过:
javac -source 1.7 MyFile.java
Run Code Online (Sandbox Code Playgroud)
你会得到预期的错误.
.java:13: error: local variable jtf is accessed from within inner class; needs to be declared final
jtf.setText(evt.getLocationOnScreen().toString());
^
1 error
Run Code Online (Sandbox Code Playgroud)
所以考试问题的答案是:只有在你使用Java 8+时它才会编译.
| 归档时间: |
|
| 查看次数: |
1982 次 |
| 最近记录: |