【问题标题】:Why Java interface can be instantiated in these codes? [duplicate]为什么Java接口可以在这些代码中实例化? [复制]
【发布时间】:2012-06-17 05:10:44
【问题描述】:

可能重复:
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,看来我们应该创建一个实现接口的类的实例。

【问题讨论】:

    标签: java class interface instantiation


    【解决方案1】:

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

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

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

    编译该类后,您可以在输出中看到一个类YourClass$1.class$1 仅仅意味着该类是一个匿名类,而数字1 是由编译器生成的。当你有两个匿名类时,它会在编译的类中有YourClass$1.classYourClass$2.class 之类的东西。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2019-01-03
          • 2022-01-06
          • 1970-01-01
          • 1970-01-01
          • 2019-06-14
          • 1970-01-01
          • 1970-01-01
          • 2013-01-20
          • 1970-01-01
          相关资源
          最近更新 更多