在Java中使用接口的匿名内部类
因此,当研究lambda表达式并使用它们在Java中用匿名内部类替换EventHandler时,我遇到了一些匿名内部类,这让我停下来思考。例如,当为通常实现ActionListener的东西编写匿名内部类时,我们编写在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 }
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
- 包含构造函数参数的括号,就像普通的类实例创建表达式一样。注意:当您实现一个接口时,没有构造函数,因此您使用一对空括号,如本例所示
- 一个主体,它是一个类声明主体。更具体地说,在主体中,允许方法声明,但不允许语句