【问题标题】:Anonymous class with interface带接口的匿名类
【发布时间】:2012-10-08 16:56:26
【问题描述】:

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

【问题讨论】:

    标签: java interface anonymous-function inner-classes


    【解决方案1】:

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

    【讨论】:

    • 那么我们实际创建的是什么实例?
    • @user1389813 传递给addActionListener 方法的实例。它实际上并不需要显式声明的类型,因为您永远不会再次使用它。编译器只是填写一些占位符名称。它只是使用您内联定义的覆盖实现ActionListener 的类。仍然可以肯定地说它是 IS-A ActionListener,因为这就是引用类型。
    • 一个新的匿名内部类对象,它实现了 ActionListener。使用匿名内部类,很明显你会实现一些接口,所以我觉得implements关键字是没有必要的。
    【解决方案2】:

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

    在你的情况下,效果是一样的:public class Foo implements ActionListener

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

            A a= new A(){ 
        
                       }; 
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-14
          • 2011-07-07
          • 1970-01-01
          • 2020-07-18
          相关资源
          最近更新 更多