【问题标题】:How exactly does actionListener using anonymous objects work?使用匿名对象的 actionListener 究竟是如何工作的?
【发布时间】:2011-12-02 17:35:32
【问题描述】:

我现在有点困惑。我有一个按钮让我们称之为 b1

现在我想添加一个 actionListener,所以通过使用匿名对象我会这样做

      b1.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae){
                             ...
                 }
           });

我无法理解 ActionListener 的对象代表什么。 ActionListener 不是接口吗?所以我们正在创建一个接口的对象?这怎么可能?我们为什么要这样做?

当我尝试这段代码时

  ActionListener al = new ActionListener();

它给了我一个错误提示

  Cannot instantiate the type ActionListener

如果我使用

   ActionListener al;

没错,但我能用 al 做什么?

提前致谢

【问题讨论】:

  • 有一个相关的例子here对比了两种实现DocumentListener接口的方式。

标签: java swing object actionlistener anonymous


【解决方案1】:

这个语法:

new ActionListener() { ... }

定义实现ActionListener 接口的匿名类。您没有创建ActionListener 的实例;您正在创建这个匿名类的实例。 (编译器实际上为它分配了一个名称——通常类似于MyEnclosingClass$1。这个匿名类将有一个单独的.class 文件。)您可以在Java tutorial 中阅读更多关于匿名内部类的信息。

您可以在函数调用中立即使用这个新对象(与您的第一个代码 sn-p 一样),也可以将其分配给具有与 ActionListener 赋值兼容的类型的变量。

ActionListener al = new ActionListener() { ... };

【讨论】:

    【解决方案2】:

    注意ActionListener 是一个接口。接口旨在由类实现。您不能实例化接口。所以这会失败:

    ActionListener al = new ActionListener();

    用 OO 的说法,你走进一家水果店,要一个“水果”。没有什么能比得上水果!一个橙子实现了水果。篮子中有一个 Orange 的实例。店主可以挑选那个橙色的“实例”给你,它是一个实物。

    同样,你不能去要求汽车。您只能从给定品牌的特定制造商处购买汽车。这里 Brand 是一个界面。

    现在让我们看看这个:

    ActionListener al;

    这相当于说橙色是水果,这是一个事实陈述。

    假设您拥有一辆注册号为 AXYZ 67112 的 BMW Lexus。您的对象是一辆您的汽车,它扩展了 BMWCars,实现了 Lexus 接口。提出以下主张是事实:

    汽车 myBMWCar; 雷克萨斯 myBMWCar;

    您需要重新认识您的 OO 概念!

    【讨论】:

      【解决方案3】:

      在我们的程序中,我们面临的情况是,我们只需要使用任何变量或某物一次,然后我们没有给它一个正确的名称,因为我们只会使用它一次。匿名类的工作方式相同。

      同样,匿名类是没有名字的类,我们只会在代码中使用一次,所以我们不给它们命名。

      这是匿名类的一个很好的例子。 Like 这个对象只会在此按钮上执行操作时使用。

      new ActionListener(){
           //code
      }
      

      这是创建匿名类的语法。

      new 用于创建类的对象(没有名称的类),然后 ActionListener 表示该类实现了此接口。所以现在你得到一个简单的类的对象,它没有名字,但可以让你覆盖 ActionListener 接口的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-26
        • 2021-08-15
        • 2012-06-08
        • 2011-10-11
        • 2013-07-05
        • 1970-01-01
        • 1970-01-01
        • 2014-09-29
        相关资源
        最近更新 更多