如果在 Java 中使用 "new" 关键字意味着内存分配,为什么匿名内部类不是这样呢?



作为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()传递刚刚发生的动作事件。

这里没有例外

最新更新