首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在JButton中添加ActionListener时,这两个相似的for循环会有不同的结果?

在JButton中添加ActionListener时,这两个相似的for循环会有不同的结果是因为它们的执行时机和作用域不同。

第一个for循环的代码如下:

代码语言:java
复制
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循环的代码如下:

代码语言:java
复制
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副本。这就是为什么它们会有不同的结果。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的合辑

领券