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

use*_*pal 2 java interface class instantiation

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

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

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

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

例1:

JButtonObject.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent e)
    {
        //codes
    }
});
Run Code Online (Sandbox Code Playgroud)

例2:

SwingUtilities.invokeLater(new Runnable()
{
    public void run()
    {
        //codes
    }
});
Run Code Online (Sandbox Code Playgroud)

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

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

Pau*_*Wee 6

该代码不实例化接口,而是实现ActionListener或实现的匿名类Runnable.

一个匿名类是没有名字的局部类.使用new运算符在单个简洁表达式中定义和实例化匿名类 .

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

编译该类后,您可以YourClass$1.class在输出中看到一个类.的$1只是意味着类是匿名类和数量1是由编译器生成的.当你有两个匿名类,就会有一些像YourClass$1.class,并YourClass$2.class在编译的类.

看到