为什么Java接口可以在这些代码被实例化? [重复](Why Java interface ca

2019-06-25 13:01发布

可能重复:
创建界面的“对象”

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

  • 我们不能实例化一个Interface 。 我们只能实例化一个class ,它实现的interface
  • new的关键字被用来创建从类的对象。

然而,当我读了一些Java程序的源代码,我发现,有时一个接口被实例化。 例如:

实施例1:

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

实施例2:

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

在上面的例子中,和ActionListener的可运行都是Java接口。 我想知道为什么他们可以在这些代码被实例化?

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

Answer 1:

代码不实例化的界面,而是它实现了一个匿名类ActionListenerRunnable

匿名类是没有名字的局部类。 匿名类被定义,并使用新的运营商在单个简洁表达实例化。

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

在编译类后,你可以看到一个类YourClass$1.class输出。 的$1只是意味着类是匿名类和数量1是由编译器生成的。 当你有两个匿名类,就会有这样的事YourClass$1.classYourClass$2.class在编译的类。

看到

  • 匿名类


Answer 2:

上面的例子并不创建界面的新实例 - 后新的关键字有电流接口的实现方法。 了解更多关于匿名类。



Answer 3:

这种形式仅仅是一个速记,使其更容易地创建一个实现了接口的对象。 这不是本身被实例化的界面,而是一个Object implements Runnable的例子。



文章来源: Why Java interface can be instantiated in these codes? [duplicate]