1

在处理匿名内部类时,我对接口的概念感到困惑。据我所知,您无法在 Java 中实例化接口,因此以下语句会出现编译错误

     ActionListener action = new ActionListener();  // compile error

当它处理匿名类时会发生什么?为什么它允许使用new?例如:

     JButton button = new JButton("A");
     button.addActionListener(new ActionListener(){    //this is fine
           @Override
           public void actionPerformed(ActionEvent e){

           }
     };

编译器是否只是创建一个类并ActionListener在幕后实现?它是如何工作的?

4

4 回答 4

5

它允许你创建一个新的匿名类来实现,ActionListener因为你提供了实现,你只是没有给它一个类名。

于 2012-10-08T16:58:26.960 回答
1

当您创建一个内部类时,您正在实例化一个实现该接口的匿名类。

在您的情况下,效果与以下内容相同:public class Foo implements ActionListener

于 2012-10-08T16:59:01.747 回答
1

您正在定义一个具有顺序分配名称的内部类,例如1,23。同时您正在使用new关键字实例化内部类。您不关心内部类的名称,因为您匿名使用它。如果您查看 bin 目录,您将看到每个匿名定义的类文件。例如,如果您在类中使用匿名类Foo,您将拥有Foo.classFoo$1.class为您创建。我相信这意味着您可以在以后使用反射实例化更多匿名类。

于 2012-10-08T17:05:26.337 回答
0

您正在创建一个类并在使用匿名类时实现接口。您可以覆盖方法或在匿名类中实现方法

    A a= new A(){ 

               }; 

这里 a 是类型 A 的引用变量,它不是指 A 而是指实现 A 的类的对象,该对象没有名称

于 2012-10-08T17:00:22.037 回答