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