在Java中使用接口的匿名内部类

在Java中使用接口的匿名内部类,java,inheritance,interface,anonymous-inner-class,Java,Inheritance,Interface,Anonymous Inner Class,因此,当研究lambda表达式并使用它们在Java中用匿名内部类替换EventHandler时,我遇到了一些匿名内部类,这让我停下来思考。例如,当为通常实现ActionListener的东西编写匿名内部类时,我们编写 myJButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e){ //DO SOMETHING }

因此,当研究lambda表达式并使用它们在Java中用匿名内部类替换EventHandler时,我遇到了一些匿名内部类,这让我停下来思考。例如,当为通常实现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创建一个类时,您正在定义一个类(内部或非内部),您必须给它一个名称,当然我们可以这样做,这也是我们经常做的。而匿名内部类没有名称,它更像一个表达式


这是我从

我想这会帮助你们理解什么是匿名类

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

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

考虑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对象的语句的一部分。(这解释了为什么右大括号后面有分号。)

你认为匿名在这里是什么意思?