我现在有点困惑。我有一个按钮让我们称之为 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做什么?
提前致谢
答案 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接口的方法。