作为Java的初学者,我被告知使用"new"关键字会导致调用构造函数,从而为对象分配内存。如果确实是这样,那么当我们写
时会发生什么呢?button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
// do something.
}
});
? ?
如果内存是分配的,它是不是违反了"接口不能被实例化"的概念?有没有新的ActionListener的内存分配?如果没有分配内存,当我们没有指定任何对象引用时,如何访问内存?或者,这是否只是作为"在'new'处分配内存"规则的例外?
新的ActionListener
已确定分配。你在ActionListener
接口中定义了一个匿名类来实现所需的方法,并且由于你已经定义了一个实现接口的具体类,编译器现在能够编译你的匿名类并实例化它。
你也可以这么做:
ActionListener al = new ActionListener() {
public void actionPerformed(ActionEvent e) { ... }
};
button.addActionListener(al);
在上面的例子中,ActionListener
已经被分配,这变得更加明显,因为它现在在方法调用之外具有作用域,并且可以在后续代码中引用。
在您的示例中,使用默认构造函数和隐式实现的ActionListener
接口创建匿名(由编译器选择的名称)类,并像使用new
关键字创建的任何其他类一样愉快地实例化。
应该把这个新词看作对象实例化。有没有新的ActionListener的内存分配?是的如果有,如何访问它?按钮对象将调用ActionListener#actionPerformed()传递刚刚发生的动作事件。
这里没有例外