当前位置: 首页 > 面试题库 >

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

朱锐
2023-03-14
问题内容

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

  • 我们无法实例化Interface。我们只能实例化class实现的interface
  • 所述new关键字被用来创建从类的对象。

但是,当我阅读某些Java程序的源代码时,我发现有时会实例化一个Interface。例如:

范例1:

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

范例2:

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

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

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


问题答案:

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

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

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

编译该类后,您可以YourClass$1.class在输出中看到一个类。这$1仅表示该类是一个匿名类,并且该数字1由编译器生成。当您有两个匿名类时,在已编译的类中将具有YourClass$1.classYourClass$2.class

看到

  • 匿名类


 类似资料:
  • 我知道类和抽象类的主要区别是,抽象类不能被实例化, 但是我可以为抽象类创建对象 我用新的关键字创建了抽象的对象 我有一些问题在 Inet 上没有正确的答案, new关键字是否用于实例类? 2)实例只不过是对象吗? 3)mEarth被称为物体(地球的实例)吗? 现在我可以调用任何方法(作为回调或作为值返回)mearth . sand();mearth . land();使用地球物体

  • 问题内容: 编写Java程序时,对CPU如何利用其缓存存储数据有影响吗?例如,如果我有一个经常访问的数组,那么它是否足够小以适合一个高速缓存行(在64位计算机上通常为128字节)是否有帮助?如果我将一个经常使用的对象保持在该限制之内,我可以期望它的成员使用的内存紧密并留在缓存中吗? 背景:我正在构建一个压缩的数字树,它受C语言中Judy数组的启发很大。虽然我主要追求其节点压缩技术,但Judy将CP

  • 问题内容: 这段代码使我凝视了几分钟: 我以前从未见过,而且我也不知道Java有一个“ loop”关键字(NetBeans甚至没有像关键字一样给它上色),并且它在JDK 6中可以很好地编译。 有什么解释? 问题答案: 这不是一个。 用法:

  • 在方法或类范围内,下面的行编译(带有警告): 在类作用域中,变量获取其默认值,以下给出未定义引用错误: 这难道不是第一个应该以相同的未定义引用错误结束吗?或者第二行应该编译?或者我错过了什么?

  • 我有一些流处理代码,它接受一个单词流并对它们执行一些操作,然后将它们简化为一个,其中包含单词作为键,单词的出现次数作为值。为了代码的简洁性,我使用了jOOL库的类,其中包含许多有用的快捷方法。 类型中的方法不适用于参数 type未定义此处适用的 为什么的行为与有任何不同,我(也许是天真地)认为它是直接等效的,为什么编译器在使用它时不能处理它? (是的,我知道我可以通过将以前的应用程序移到操作中来删

  • 错误在: "公共类MapsActive扩展FragmentActive实现OnMapReadyCallback" 它的下划线为红色,表示要么声明我的类为“抽象”,要么实现一个抽象方法。 提示说我可以实现这个方法。这是什么意思?