2013-08-22 85 views
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(){} ”

+2

它不是一个构造函数调用,它创建一个匿名的内部类,它实现了'ActionListener' –

回答

0

你正在建设一个子类。

+0

为了更清楚你正在定义一个新类。这个类是匿名的 - 它没有名字,只存在于该函数中。你不能创造更多。但是该行定义它并创建它的一个实例。 –

2

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

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

当然除了扩展java.lang.Object你的匿名类实现ActionListener - 这就是为什么你可以将它传递给addActionListener方法。

0

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

报价:

如果一个类不包含任何构造函数声明,那么默认的构造函数 没有正式参数,没有throws子句是​​ 隐式声明。

0

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

匿名类表达式由以下部分组成:实施
1.新的运营商
2.接口的名称或类来扩展。
3.包含构造函数参数的父类,就像普通的类实例创建表达式一样。注意:在实现接口的情况下,没有构造函数,因此您使用一对空括号。

0

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

现在我们在这里的是关心的只是细节,这个新类应该子类型接口,为此我们提供了必要的方法实现。

这个类的构造函数是默认之一,并且执行工作很好,因为没有实例变量关联。

0

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

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

0

这就是匿名类如何(语法明智)。

按照docs

匿名类表达式由以下部分组成:

  1. 的新的运营商
  2. 的接口的名称来实现或类来扩展。
  3. 括号包含构造函数的参数,就像一个 普通类实例创建表达式。注意:在实现接口的 的情况下,没有构造函数,因此您使用空的一对圆括号 。
  4. 身体,这是一个类声明的主体。更具体地说,在 正文中,方法声明是允许的,但声明不是。
相关问题