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

时间:2012-06-17 05:10:45

标签: java class interface instantiation

  

可能重复:
  Creating an “object” of an interface

我是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和Runnable都是Java接口。我可以知道为什么可以在这些代码中实例化它们吗?

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

3 个答案:

答案 0 :(得分:6)

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

  

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

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

编译该类后,您可以在输出中看到类YourClass$1.class$1只是意味着类是一个匿名类,编号器生成数字1。如果您有两个匿名类,则在编译的类中将包含YourClass$1.classYourClass$2.class

查看

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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