使用Java接口的匿名内部类



因此,在研究lambda表达式并使用它们替换Java中EventHandlers的匿名内部类时,我遇到了一些匿名内部类,这些类让我停下来思考。例如,当为通常实现ActionListener的东西编写匿名内部类时,我们编写

myJButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e){
        //DO SOMETHING
    }
});

我对此感到困惑的是,ActionListener是一个接口,所以我认为有必要做一些类似。。。

myJButton.addActionListener(new myButtonListener implements ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e){
        //DO SOMETHING
    }
});

但这甚至没有编译。我想我认为这显然是因为如果我们使用私有内部类,我们使用

private MyButtonListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        //DO SOMETHING
    }
}
myJButton.addActionListener(new MyButtonListener());

所以我的问题是:

1) 为什么我们能够直接从接口创建匿名内部类,而不必通过实现接口的类来创建?

2) 为什么我不能创建一个实现ActionListener的匿名内部类,而不是像我在第二个代码片段中显示的那样直接从它创建?

1) 为什么我们能够直接从接口,而不是必须通过一个类创建一个实现接口?

2) 为什么我无法创建实现的匿名内部类ActionListener,而不是像我在第二段代码中显示的那样直接从它一小条

当您使用implements XXXX创建一个类时,您正在定义一个类(内部或非内部),您必须给它一个名称,确保我们可以做到这一点,这是我们经常做的。而匿名内部类没有名称,它更像是一个表达式。


我复制自http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

我认为这将帮助你理解什么是匿名类

匿名类是一个表达式。它们就像本地类,只是没有名称

匿名类表达式的语法类似于构造函数的调用,只是代码块中包含一个类定义。

考虑frenchGreeting对象的实例化:

    HelloWorld frenchGreeting = new HelloWorld() {
        String name = "tout le monde";
        public void greet() {
            greetSomeone("tout le monde");
        }
        public void greetSomeone(String someone) {
            name = someone;
            System.out.println("Salut " + name);
        }
    };

匿名类表达式由以下内容组成:

  • 新运营商

  • 要实现的接口或要扩展的类的名称。在本例中,匿名类正在实现接口HelloWorld。

  • 包含构造函数参数的括号,就像普通的类实例创建表达式一样。注意:当您实现一个接口时,没有构造函数,所以您使用一对空括号,如本例所示。

  • 一个主体,它是一个类声明主体。更具体地说,在主体中,允许方法声明,但不允许语句。

因为匿名类定义是一个表达式,所以它必须是语句的一部分。在本例中,匿名类表达式是实例化frenchGreeting对象的语句的一部分。(这解释了为什么右大括号后面有分号。)

最新更新