在JButton中添加ActionListener时,这两个相似的for循环会有不同的结果是因为它们的执行时机和作用域不同。
第一个for循环的代码如下:
for (int i = 0; i < 5; i++) {
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println(i);
}
});
}
在这个循环中,每次循环都会创建一个新的ActionListener对象,并将其添加到按钮的监听器列表中。当按钮被点击时,每个ActionListener都会执行其actionPerformed方法,并打印变量i的值。然而,由于Java的闭包特性,这里的问题在于变量i是在循环中定义的,而不是在每个ActionListener中定义的。因此,当按钮被点击时,所有的ActionListener都会引用同一个变量i,而这个变量在循环结束后的最终值是5。因此,无论点击哪个按钮,都会打印出5。
第二个for循环的代码如下:
for (int i = 0; i < 5; i++) {
final int index = i;
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println(index);
}
});
}
在这个循环中,我们引入了一个新的变量index,并将循环变量i的值赋给它。然后,我们在每个ActionListener中引用这个index变量。由于Java的闭包特性,每个ActionListener都会持有一个对应的index变量的副本。因此,当按钮被点击时,每个ActionListener打印的都是它们各自持有的index变量的值,而不是同一个变量。因此,点击不同的按钮会打印出不同的值,分别是0、1、2、3、4。
总结起来,第一个for循环中的ActionListener共享同一个变量i,而第二个for循环中的ActionListener持有各自的变量index副本。这就是为什么它们会有不同的结果。
领取专属 10元无门槛券
手把手带您无忧上云