【问题标题】:Java - Which types of classes are these; which is the anonymous inner class?Java - 这些是哪些类型的类;哪个是匿名内部类?
【发布时间】:2012-04-10 14:11:18
【问题描述】:

我读过几篇相互矛盾的在线文章。我认为这将是一个匿名内部类的示例:

button.addActionListener(new ActionListener() {
    public void actionPerfored(ActionEvent e) {
       // do something.
    }
});

但是,我也看到这被描述为匿名内部类:

ActionListener myListener = new ActionListener() { 
    public void actionPerformed(ActionEvent event) {
          // do something.
    }
};
button.addActionListener(myListener);

哪个是哪个,为什么?谢谢!

【问题讨论】:

    标签: java actionlistener inner-classes anonymous-inner-class


    【解决方案1】:

    两者都是。第二个只是在添加为动作监听器之前分配给一个变量。

    这和两者的区别是一样的

    myList.add(new String("myString"));
    

    String s = new String("myString");
    myList.add(s);
    

    它与匿名类无关。

    【讨论】:

    • 作为注释,如果您想为多个按钮使用相同的动作侦听器,第二个可能会很有用。
    • 应该提到两者都是匿名内部类,因为 classes 没有名称(与实例名称无关)。
    • @Tim Class 没有与之关联的名称,这使它匿名(ActionListenerInterface 而不是 Class),而不是 instance(在这种情况下,myListener) 有一个名字。
    • 正如@Anthales 所说,该类没有名称;如果你想要一个非匿名类,你必须做class MyClass implements ActionListener { ... };这个类将被称为MyClass。在匿名类中,您定义了一个包含新方法的类,但它没有名称——我们只知道它继承自 ActionListener
    • @Tim ActionListener 是一个接口;如果你尝试做myListener = new ActionListener(); 你会得到一个错误,因为 ActionListener 不是一个类。如果你想要一个实现 ActionListener 的对象,你需要提供void ActionPerformed 的代码。要以非匿名方式执行此操作,您必须在我之前的评论中编写一个像 MyClass 这样的新类。作为替代方案,您可以在构造实例的同时为void ActionPerformed 提供代码。 This 似乎是一个不错的教程。
    【解决方案2】:

    两者都是匿名内部类。在第二种情况下,您将存储对匿名类的引用,以便稍后调用它的某些方法。

    【讨论】:

      【解决方案3】:

      正如 Richante 所说,他们都是。

      想想看,它们都是未命名的,并且是在另一个类中定义的。

      【讨论】:

        【解决方案4】:

        两者实际上都是匿名内部类的示例。在第一个示例中,匿名内部类在将参数传递给 addActionListener() 方法时提供。在第二个示例中,创建了对匿名内部类的引用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-09
          • 2017-10-07
          • 2011-01-20
          • 2014-09-16
          • 2022-01-15
          • 1970-01-01
          相关资源
          最近更新 更多