1

作为 Java 的初学者,我被告知使用“new”关键字会导致调用构造函数,从而为对象分配内存。如果确实如此,那么当我们编写时会发生什么:

button.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e)
   {
      // do something.
   }
}); 

??

如果分配内存,是不是违反了“接口不能实例化”的概念?新的 ActionListener 是否没有内存分配?如果没有分配内存,当我们没有指定任何对象引用时,它是如何访问的?或者,这是否只是“在‘新’处分配内存”规则的一个例外?

4

3 回答 3

4

ActionListener的肯定是分配的。您定义了一个实现接口中所需方法的匿名类ActionListener,并且由于您定义了一个实现接口的具体类,编译器现在能够编译您的匿名类并实例化它。

你可以很容易地做到:

ActionListener al = new ActionListener() {
    public void actionPerformed(ActionEvent e) { ... }
};
button.addActionListener(al);

在上面的示例中,ActionListener已分配的变得更加明显,因为它现在具有方法调用之外的范围,并且可以在后续代码中引用。

于 2014-03-18T13:25:03.627 回答
2

在您的情况下,匿名(由编译器选择的名称)类是使用默认构造函数和隐式实现的接口创建的,并且像您使用关键字ActionListener创建的任何其他类一样愉快地实例化。new

于 2014-03-18T13:26:55.740 回答
0

而是将新词视为对象实例化。新的 ActionListener 是否没有内存分配?是 如果是这样,它是如何访问的?按钮对象将调用 ActionListener#actionPerformed() 传递刚刚发生的动作事件。

这里的规则没有例外。

于 2014-03-18T13:28:29.410 回答