我一直在尝试学习如何使用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
谢谢你能提供的任何帮助。
1条答案
按热度按时间ldxq2e6h1#
在这两种情况下,新的匿名子类
ActionListener
临时“创建”(它是短暂的),并创建该匿名类的单个示例对象。匿名类示例有一个方法,actionPerformed()
.因此,在呼吁
addActionListener()
您正在传递对新创建的匿名类示例的引用。addActionListener()
将该引用添加到事件处理程序和返回的列表中。稍后,当事件发生时,框架将向
myButton
对象,它查看其事件处理程序列表并调用actionPerformed()
依次在每一个上。您的匿名示例是被调用的处理程序之一。