Java 循环内部的匿名侦听器

Java 循环内部的匿名侦听器,java,mouselistener,Java,Mouselistener,这可能是一个愚蠢的问题,但在我的代码中,当在面板上执行鼠标单击时,循环条件中的项是否与项对话框的项参数相同 for (Item item: itemsList) { JPanel panel = new ItemPanel(item); panel.addMouseListener(new MouseListener() { public void mouseClicked(MouseEvent arg0) {

这可能是一个愚蠢的问题,但在我的代码中,当在面板上执行鼠标单击时,循环条件中的项是否与项对话框的项参数相同

for (Item item: itemsList) {
        JPanel panel = new ItemPanel(item);
        panel.addMouseListener(new MouseListener() {
            public void mouseClicked(MouseEvent arg0) {
                new ItemDialog(item);
            }
            public void mouseEntered(MouseEvent arg0) {}
            public void mouseExited(MouseEvent arg0) {}
            public void mousePressed(MouseEvent arg0) {}
            public void mouseReleased(MouseEvent arg0) {}
});

是的,答案很简单

但是,正如我在评论中所说,这里发生了很多事情

匿名内部类令人困惑:这与Javascript中的闭包类似

它们可以访问在自身外部定义的变量。他们将来仍然可以在任意点访问这些相同的变量引用,即使变量超出范围。使这成为可能的规则是,这些变量必须声明为
final

这篇文章比我能解释的更好:

旁白:自Java8以来,编译器自动生成每个
Item
变量
final
,因为它发现它们正在匿名内部类中使用。因此,它们实际上成为:

for (final Item item: itemsList) {

对对于每个循环,您的
中没有其他
,因此参考非常简单。调试IDE中的代码,你看到了什么?对投票人说:这不是一个愚蠢的问题。这是一个很好的问题,关于匿名内部类的混乱作用域,以及它们如何保证值在将来仍然相同。加上循环作用域变量。再加上Java-8自动生成变量
final
。我不理解否决票。有几十个错误的假设导致了错误,例如stackoverflow.com/questions/8327781/(编辑:或简称:我同意Spoon先生的说法)如果在这个领域7和8之间有差异,那么可能用java版本标记它?我得说它一开始不会编译。感谢@MrSpoon指出我不知道的差异。