Java 带接口的匿名类

Java 带接口的匿名类,java,interface,anonymous-function,inner-classes,Java,Interface,Anonymous Function,Inner Classes,在处理匿名内部类时,我对接口的概念感到困惑。据我所知,您无法在Java中实例化接口,因此下面的语句将有编译错误 ActionListener action = new ActionListener(); // compile error 当它处理匿名类时会发生什么?为什么它允许使用新的?例如: JButton button = new JButton("A"); button.addActionListener(new ActionListe

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

     ActionListener action = new ActionListener();  // compile error
当它处理匿名类时会发生什么?为什么它允许使用新的?例如:

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

           }
     };

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

它允许您创建一个实现ActionListener的新匿名类,因为您提供的是实现,而不是给它一个类名。

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

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


在您的例子中,效果是相同的:公共类Foo实现ActionListener

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


在您的情况下,效果与:公共类Foo实现ActionListener的效果相同。在使用匿名类时,您正在创建一个类并实现接口。您可以重写这些方法或在匿名类内实现该方法

    A a= new A(){ 

               }; 

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

在使用匿名类时,您正在创建一个类并实现接口。您可以重写该方法或在匿名类内实现该方法

    A a= new A(){ 

               }; 

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

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

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

那么我们实际上在创建什么实例?@user1389813您正在传递给addActionListener方法的实例。它实际上不需要显式声明的类型,因为您再也不会使用它了。编译器只是填写一些占位符名称。它只是使用您内联定义的覆盖实现ActionListener的类。可以肯定地说,它是一个ActionListener,因为引用类型就是这样。一个实现ActionListener的新匿名内部类对象。对于匿名内部类,很明显您将实现一些接口,因此我觉得implements关键字不是必需的。那么我们实际创建的是什么实例?@user1389813您正在传递给addActionListener方法的实例。它实际上不需要显式声明的类型,因为您再也不会使用它了。编译器只是填写一些占位符名称。它只是使用您内联定义的覆盖实现ActionListener的类。可以肯定地说,它是一个ActionListener,因为引用类型就是这样。一个实现ActionListener的新匿名内部类对象。对于匿名内部类,很明显您将实现一些接口,因此我觉得implements关键字不是必需的。