java预期变量错误,java – 引用非最终变量:为什么这段代码编译?

文章讨论了一段Java代码,该代码使用匿名内部类访问非final局部变量jtf。尽管Eclipse在运行时抛出了错误,但代码在命令行下却能编译并运行成功。作者指出,匿名内部类通常需要访问的局部变量必须是final的,但这里的情况似乎不同。经过实验,代码在鼠标悬停在JTextField上时才出现预期的编译错误。这引发了关于Java编译器差异和匿名内部类对非final局部变量访问规则的疑问。
摘要由CSDN通过智能技术生成

首先,如果这是一个重复的问题,我道歉。我发现很多类似的,但没有一个直接解决我的问题。

为了准备即将到来的考试,我在做一份过去的文章。它有一个问题,给出一个代码片段。我们必须声明它是否编译,如果没有编写第一个编译器错误发生的行,并解释它。这是代码段:

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 = …]。

我对匿名内部类的理解是他们可以访问:

>包含类的字段

>封装类的方法

>封闭范围的局部变量,前提是它们是最终的

那么我失踪了什么?根据我知道,这段代码不应该工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值