带接口的匿名类

时间:2012-10-08 16:56:27

标签: java interface anonymous-function inner-classes

在处理匿名内部类时,我对界面的概念感到困惑。据我所知,你不能在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吗?它是如何工作的?

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

创建内部类时,您将实例化实现该接口的匿名类。

在您的情况下,效果与:public class Foo implements ActionListener

相同

答案 2 :(得分:1)

您正在使用顺序指定的名称定义内部类,例如123等。同时您使用{{实例化内部类1}}关键字。您不关心内部类的名称,因为您是匿名使用它。如果查看bin目录,您将看到每个匿名定义的类文件。例如,如果您在类new中使用了匿名类,则可以为您创建FooFoo.class。我相信这意味着你可以在以后使用反射来实例化更多的匿名类。

答案 3 :(得分:0)

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

    A a= new A(){ 

               }; 

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