actionListener使用匿名对象的工作原理是什么?

时间:2011-12-02 17:35:33

标签: java swing object actionlistener anonymous

我现在有点困惑。我有一个按钮让我们称之为 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做什么?

提前致谢

3 个答案:

答案 0 :(得分:4)

此语法:

new ActionListener() { ... }

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

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

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

答案 1 :(得分:1)

请注意ActionListener是一个界面。接口应由类实现。你 无法 实例化接口。所以这会失败:

  

ActionListener al = new ActionListener();

用OO的说法,你走进一家水果店,要求一个“水果”。没有什么比得上水果!橙子实施水果。篮子里有一个橙色的例子。店主可以选择橙色的“实例”并将其交给您,这是一个实际的对象。

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

现在让我们看看:

  

ActionListener al;

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

假设您拥有一辆注册号为AXYZ 67112的BMW Lexus。您的物品是一辆汽车,它可以扩展BMWCars,实现雷克萨斯接口。这是事实上提出以下主张:

  

Car myBMWCar;   雷克萨斯myBMWCar;

你需要刷新你的OO概念!

答案 2 :(得分:0)

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

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

这是一个很好的匿名类的例子。 Like此对象仅在将对此按钮执行Action时使用。

new ActionListener(){
     //code
}

这是创建匿名类的语法。

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