1

我正在阅读一篇关于内部类的文章。我找到了一个演示匿名内部类的示例(如下所述)。

  button1 = new JButton();
  button2 = new JButton();
  ...
  button1.addActionListener(
     new java.awt.event.ActionListener()
     {
        public void actionPerformed(java.awt.event.ActionEvent e)
        {
           // do something
        }
     }
  );

根据示例,它创建了一个内部类,用于使用 ActionListener 接口响应按钮。据我所知,接口没有构造函数。但我想知道,他们如何调用构造函数。

“新的 java.awt.event.ActionListener(){}”

4

8 回答 8

2

接口没有构造函数,但匿名类有:像所有类一样,它java.lang.Object隐式扩展,因此它可以调用Object的无参数构造函数。

此外,Object的构造函数是您可以调用的唯一构造函数,因为匿名类不能定义自定义构造函数。

当然,除了扩展java.lang.Object您的匿名类实现之外ActionListener- 这就是您可以将它传递给addActionListener方法的原因。

于 2013-08-22T04:02:28.473 回答
0

您没有实例化接口。您要求编译器创建一个实现该接口的匿名类并立即创建该类的一个实例。

证明这一点的最好方法是转到“类”目录。您将找到格式为className$1.classclassName$2.class等的文件。这些文件对应于那些匿名类。如果您要实例化接口本身,则不需要这些新的类文件(当然还有它们包含的匿名类)。

于 2013-08-22T04:16:30.507 回答
0

这就是匿名类的方式(语法方面)。

根据文档

匿名类表达式包括以下内容:

  1. 新运营商
  2. 要实现的接口或要扩展的类的名称。
  3. 包含构造函数参数的括号,就像普通的类实例创建表达式一样。注意:在实现接口的情况下,没有构造函数,因此使用一对空括号。
  4. 一个主体,它是一个类声明主体。更具体地说,在正文中,允许方法声明,但不允许声明。
于 2013-08-22T04:18:17.593 回答
0

您正在构建一个子类。

于 2013-08-22T04:01:46.030 回答
0

快速查看 Java 规范 - 特别是默认构造函数部分。你得到一个构造函数,因为当你实例化一个接口的实例时,它将是一个对象。

引用规范:

如果一个类不包含构造函数声明,则隐式声明一个没有形式参数且没有 throws 子句的默认构造函数。

于 2013-08-22T04:02:40.173 回答
0

new java.awt.event.ActionListener(){ }
ActionListener该语句创建一个实现接口 的匿名类对象。
那就是您正在调用匿名类默认构造函数而不是接口之一。
根据java文档

匿名类表达式包括以下内容:
1.new 运算符
2.要实现的接口或要扩展的类的名称。
3. 包含构造函数参数的括号,就像普通的类实例创建表达式一样。注意:在实现接口的情况下,没有构造函数,因此使用一对空括号。

于 2013-08-22T04:04:41.223 回答
0

匿名内部类:没有名字的内部类。

现在我们关心的唯一细节是,这个新类应该subType接口,为此我们提供必要的方法实现。

此类的构造函数是默认构造函数,并且由于没有关联的实例变量,因此可以很好地完成工作。

于 2013-08-22T04:04:54.247 回答