2

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

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

  • 我们不能实例化一个Interface. 我们只能实例化class实现了 的a 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 接口。我可以知道为什么它们可以在这些代码中实例化吗?

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

4

3 回答 3

6

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

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

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

编译该类后,您可以YourClass$1.class在输出中看到一个类。简单地说,$1class 是一个匿名类,编号1由编译器生成。当你有两个匿名类时,它会在编译的类中YourClass$1.class有类似的东西。YourClass$2.class

于 2012-06-17T05:13:58.657 回答
1

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

于 2012-06-17T05:14:17.457 回答
0

这种形式只是一种简写形式,可以更轻松地创建实现接口的对象。实例化的不是接口本身,而是一个Object implements Runnable例子。

于 2012-06-17T05:14:10.143 回答