在“addactionlistener”和类似的行为方法中,传递lambda表达式(或匿名类)是如何工作的?

agxfikkp  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(259)

我一直在尝试学习如何使用lambda函数,这似乎很有意义,但后来我看到它作为函数参数传入,特别是在 addActionListener() 方法,首先他们使用了一个匿名类,并展示了如何用lambda表达式替换它。我试着查看java文档中函数的定义,以便更好地理解它,但我没能理解代码是如何工作的,因为它看起来不像任何东西直接与对象的方法或lambda表达式交互(代码来自教程):

...
myButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        System.out.println("You pressed a button");
    }
});
...
myButton.addActionListener(
    (e) -> System.out.println("You pressed a button");
);

如何在 addActionListener 方法(更具体地说是 add 中的方法 EventListenerList 类)在按下按钮时被调用?它是如何工作的?它是否发生在java本身的某个地方,而不是表面上显示?
第1124行:https://developer.classpath.org/doc/javax/swing/abstractbutton-source.html
第142行:https://developer.classpath.org/doc/javax/swing/event/eventlistenerlist-source.html
谢谢你能提供的任何帮助。

ldxq2e6h

ldxq2e6h1#

在这两种情况下,新的匿名子类 ActionListener 临时“创建”(它是短暂的),并创建该匿名类的单个示例对象。匿名类示例有一个方法, actionPerformed() .
因此,在呼吁 addActionListener() 您正在传递对新创建的匿名类示例的引用。 addActionListener() 将该引用添加到事件处理程序和返回的列表中。
稍后,当事件发生时,框架将向 myButton 对象,它查看其事件处理程序列表并调用 actionPerformed() 依次在每一个上。您的匿名示例是被调用的处理程序之一。

相关问题