将接口的对象作为方法的参数进行初始化?

问题描述:

我所知,你不能做的接口的对象,而不是然而实现接口,类的对象,而在寻找的事件处理程序的教程,我发现了以下内容:将接口的对象作为方法的参数进行初始化?

b.addActionListener(new ActionListener(){ 
public void actionPerformed(ActionEvent e){ 
     tf.setText("Welcome to Javatpoint."); 
} 
}); 

首先,我不知道你可以在一个方法的参数中构造一个对象。其次,我知道ActionListener是一个接口,那么new ActionListener究竟在做什么呢?在阅读后我得到了一个模糊的想法,这实际上是在创建一个实现Action Listener的新类,但是这个类叫什么?我可以制作这个班的其他物体吗?最后,究竟是上面的代码从以下任何不同:

//where MyActionListener is a class that implements ActionListener 

MyActionListener objectOfActionListener = new MyActionListener(); 
b.addActionListener(objectOfActionListener); 

//and the method for actionPerformed is in the MyActionListener class 
+2

这是一个匿名类。它创建一个实现ActionListener的未命名类。当某些事情要求您使用实现接口的类时很有用,但您不希望编写完整的命名类的麻烦。 – Carcigenicate

+0

请参阅:https://stackoverflow.com/help/someone-answers – c0der

这是一个anonymous class实现了ActionListener接口。

你当然可以创建一个你自己的显式类并实例化它,但除非你需要在多个地方重复使用相同的逻辑,否则没有什么大的好处。

+0

啊,对,在这​​里创建的对象也是一个匿名对象?它是否仅仅作为该方法的争论而存在? – Psear

+1

@Psear在这种情况下,雅。您可以将其分配给一个类型为ActionEvent的变量,以延长其使用时间并在其他地方使用。还应该注意的是,通过引入'FunctionalInterface's,不再需要使用匿名类。您的整个代码片段可以被替换为一个类似于'(ActionEvent e)=> {tf.setText(“Welcome to Javatpoint。”)的lambda。 }'。 – Carcigenicate