Java 新的ActionListener()是什么意思?

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

在第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 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
来“实例化接口”,为什么我们称之为内部接口?为什么不仅仅是匿名类?