Java 新的ActionListener()是什么意思?
在第3行,Java 新的ActionListener()是什么意思?,java,Java,在第3行,ActionListener()关键字之后的new是什么意思?我知道这是匿名类的结构,但我不明白 Button okButton = new Button("Open a Frame"); okButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { statusLabel.setText("A Frame shown to the
ActionListener()
关键字之后的new
是什么意思?我知道这是匿名类的结构,但我不明白
Button okButton = new Button("Open a Frame");
okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
statusLabel.setText("A Frame shown to the user.");
frame.setVisible(true);
}
});
您正在创建匿名
ActionListener
类并实现actionPerformed
方法。新建ActionListener()创建类型为ActionListener
的匿名内部类。因为ActionListener可能不是一个类,而是一个接口,所以不能简单地创建一个新实例,比如objectobj=newobject()代码>完成。您必须实现该接口定义的方法。
在您的情况下,这只是一种方法actionPerformed
编辑:
让我们假设ActionListener
是一个接口(public Interface ActionListener
),而不是一个对象(public class ActionListener
),因为这是UI开发中最常见的事情
如果您有以下代码:
okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
statusLabel.setText("A Frame shown to the user.");
frame.setVisible(true);
}
});
您已经组合了很多语句,这会给年轻和缺乏经验的开发人员带来一些困惑。
让我们把这些陈述拆分一点,让它变得更加生动
ActionListener myListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
statusLabel.setText("A Frame shown to the user.");
frame.setVisible(true);
}
};
okButton.addActionListener(myListener);
现在我们在第一行中看到了一个简单的对象实例,我们已经从其他对象中了解到了它。但是,为什么我们需要开始括号,为什么我们需要实现一个方法
这是因为我们假设ActionListener是一个接口。接口中定义的所有方法都是抽象的,需要先实现,然后才能以任何方式使用它们。(另一方面,如果ActionListener是一个类
,那么actionPerformed
方法将被定义为类内的抽象
)
所以你基本上实例化了一个接口。但是等等,你什么时候可以实例化一个接口?
因为你把它当作匿名的
实例化可以按如下方式编写:抽象代码:
ActionListener myListener = new Object implements ActionListener;
对象的构造实现了ActionListener
确实会产生一个新类型,没有名称,这就是匿名的原因。由于它没有名字,您不能在其他任何地方创建它的另一个实例
如果您将整个代码拆分并“提取”匿名部分,使其不再是匿名的,您将得到如下结果:
//Class MyListener
public class MyListener implements ActionListener
{
public void actionPerformed(ActionEvent e) {
statusLabel.setText("A Frame shown to the user.");
frame.setVisible(true);
}
}
//Class FooBar
MyListener myListener = new MyListener();
okButton.addActionListener(myListener);
此语法:
new ActionListener() { ... }
定义实现ActionListener接口的匿名类。您没有创建ActionListener的实例;您正在创建此匿名类的实例。(编译器实际上为它指定了一个名称,通常类似于MyEnclosingClass$1
。这个匿名类将有一个单独的.class
文件。)您可以在Java教程中阅读有关匿名内部类的更多信息
您可以在函数调用中立即使用此新对象(与第一个代码段一样),也可以将其分配给类型与ActionListener兼容的变量
ActionListener al = new ActionListener() { ... };
您“没有得到”的确切内容是什么?请您更详细地阐述一下您答案的这一部分好吗?“因为ActionListener可能不是一个类,而是一个接口,您不能简单地创建一个新实例,如Object obj=new Object();
并完成。”我更新了我的帖子。希望不要太混乱,我的咖啡因快用完了。很好的答案。。。谢谢。。。我是从下面这句话中得到的。。。ActionListener myListener=新对象实现ActionListener;我们有匿名类,所以我们知道它没有名字,所以它看起来像。。。ActionListener myListener=new _______;实现ActionListener;但是由于没有类名,所以implement关键字不应该在那里,对吗?new Object implements ActionListener
的行不是Java,而是一个抽象代码,用来指出后台发生了什么。在Java中,您只需使用newActionListener
来“实例化接口”,为什么我们称之为内部接口?为什么不仅仅是匿名类?