在处理匿名内部类时,我对界面的概念感到困惑。据我所知,你不能在JAVA中实例化一个接口,所以下面的语句会有编译错误
ActionListener action = new ActionListener(); // compile error
但是当它处理匿名类时会发生什么?为什么允许使用新?例如
JButton button = new JButton("A");
button.addActionListener(new ActionListener(){ //this is fine
@Override
public void actionPerformed(ActionEvent e){
}
};
编译器只是创建一个类并在场景后面实现ActionListener
吗?它是如何工作的?
答案 0 :(得分:5)
它允许您创建一个实现ActionListener
的新匿名类,因为您提供了实现,而您只是没有给它一个类名。
答案 1 :(得分:1)
创建内部类时,您将实例化实现该接口的匿名类。
在您的情况下,效果与:public class Foo implements ActionListener
答案 2 :(得分:1)
您正在使用顺序指定的名称定义内部类,例如1
,2
,3
等。同时您使用{{实例化内部类1}}关键字。您不关心内部类的名称,因为您是匿名使用它。如果查看bin目录,您将看到每个匿名定义的类文件。例如,如果您在类new
中使用了匿名类,则可以为您创建Foo
和Foo.class
。我相信这意味着你可以在以后使用反射来实例化更多的匿名类。
答案 3 :(得分:0)
在使用匿名类时,您正在创建一个类并实现该接口。您可以覆盖方法或在匿名类中实现该方法
A a= new A(){
};
这里a是A类型的引用变量,它不是指A而是指实现A没有名字的类的对象