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

为什么Java接口可以在这些代码中实例化?,java,class,interface,instantiation,Java,Class,Interface,Instantiation,可能重复: 我是Java新手。根据我的理解: 我们无法实例化接口。我们只能实例化实现接口的类 new关键字用于从类创建对象 然而,当我阅读一些Java程序的源代码时,我发现有时会实例化接口。例如: 示例1: JButtonObject.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //codes } }); SwingUti

可能重复:

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

  • 我们无法实例化
    接口
    。我们只能实例化实现
    接口的
  • new
    关键字用于从类创建对象
然而,当我阅读一些Java程序的源代码时,我发现有时会实例化接口。例如:

示例1:

JButtonObject.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent e)
    {
        //codes
    }
});
SwingUtilities.invokeLater(new Runnable()
{
    public void run()
    {
        //codes
    }
});
示例2:

JButtonObject.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent e)
    {
        //codes
    }
});
SwingUtilities.invokeLater(new Runnable()
{
    public void run()
    {
        //codes
    }
});
在上面的示例中,ActionListener和Runnable都是Java接口。我可以知道为什么它们可以在这些代码中实例化吗


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

该代码没有实例化接口,而是一个实现
ActionListener
Runnable
的匿名类

匿名类是没有名称的本地类。匿名班级 在单个简洁表达式中使用 新接线员

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

编译该类后,您可以在输出中看到一个类
YourClass$1.class
$1
仅仅意味着类是一个匿名类,并且编号
1
由编译器生成。当您有两个匿名类时,它将在编译的类中包含类似于
YourClass$1.class
YourClass$2.class
的内容


此表单只是一个简写,可以更轻松地创建实现接口的对象。举例来说,实例化的不是接口本身,而是一个
对象实现了可运行的

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