为什么Java接口可以在这些代码中实例化?

可能重复:
创建接口的“对象”

我是Java新手。 根据我的理解:

  • 我们无法实例化Interface 。 我们只能实例化一个实现interfaceclass
  • new关键字用于从类创建对象。

但是,当我读取某些Java程序的源代码时,我发现有时会实例化一个接口。 例如:

例1:

 JButtonObject.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //codes } }); 

例2:

 SwingUtilities.invokeLater(new Runnable() { public void run() { //codes } }); 

在上面的示例中,ActionListener和Runnable都是Java接口。 我可以知道为什么可以在这些代码中实例化它们吗?

实例化接口的目的是什么? 参考这个例子 ,似乎我们应该创建一个实现接口的类的实例。

该代码不实例化接口,而是实现ActionListenerRunnable的匿名类。

匿名类是没有名称的本地类。 使用new运算符在单个简洁表达式中定义和实例化匿名类。

代码是匿名创建ActionListener的实例,这意味着该类实际上没有任何名称。

编译该类后,您可以在输出中看到一个类YourClass$1.class$1只是意味着class是一个匿名类,编号为1 。 当你有两个匿名类时,它将在编译的类中有类似YourClass$1.classYourClass$2.class东西。

看到

  • 匿名类

上面的例子没有创建新的接口实例 – 在new关键字之后有当前接口的实现方法。 阅读有关匿名课程的更多信息。

此表单只是一种简化,可以更轻松地创建实现接口的对象。 它不是实例化的接口本身,而是一个Object implements Runnable