Java 带接口的匿名类
在处理匿名内部类时,我对接口的概念感到困惑。据我所知,您无法在Java中实例化接口,因此下面的语句将有编译错误Java 带接口的匿名类,java,interface,anonymous-function,inner-classes,Java,Interface,Anonymous Function,Inner Classes,在处理匿名内部类时,我对接口的概念感到困惑。据我所知,您无法在Java中实例化接口,因此下面的语句将有编译错误 ActionListener action = new ActionListener(); // compile error 当它处理匿名类时会发生什么?为什么它允许使用新的?例如: JButton button = new JButton("A"); button.addActionListener(new ActionListe
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吗?它是如何工作的?它允许您创建一个实现ActionListener的新匿名类,因为您提供的是实现,而不是给它一个类名。它允许您创建一个实现ActionListener的新匿名类,因为您提供的是实现,您只是没有给它一个类名。当您创建一个内部类时,您正在实例化一个实现接口的匿名类
在您的例子中,效果是相同的:公共类Foo实现ActionListener当您创建内部类时,您正在实例化一个实现接口的匿名类
在您的情况下,效果与:公共类Foo实现ActionListener的效果相同。在使用匿名类时,您正在创建一个类并实现接口。您可以重写这些方法或在匿名类内实现该方法
A a= new A(){
};
这里a是类型a的引用变量,它不是指a,而是指实现a的类的对象,该类没有名称在使用匿名类时,您正在创建一个类并实现接口。您可以重写该方法或在匿名类内实现该方法
A a= new A(){
};
这里a是一个类型a的引用变量,它不是指a,而是指一个类的对象,该类实现了一个没有名称的类。您正在使用顺序分配的名称定义一个内部类,如1、2、3等。同时,您正在使用新关键字实例化内部类。您不关心内部类的名称,因为您是匿名使用它的。如果查看bin目录,您将看到每个匿名定义的类文件。例如,如果在类Foo中使用匿名类,则将为您创建Foo.class和Foo$1.class。我相信这意味着您可以在以后使用反射来实例化更多的匿名类。您正在使用顺序分配的名称(如1、2、3等)定义一个内部类。同时,您正在使用新关键字实例化内部类。您不关心内部类的名称,因为您是匿名使用它的。如果查看bin目录,您将看到每个匿名定义的类文件。例如,如果在类Foo中使用匿名类,则将为您创建Foo.class和Foo$1.class。我相信这意味着您可以在以后使用反射实例化更多的匿名类。那么我们实际上在创建什么实例?@user1389813您正在传递给addActionListener方法的实例。它实际上不需要显式声明的类型,因为您再也不会使用它了。编译器只是填写一些占位符名称。它只是使用您内联定义的覆盖实现ActionListener的类。可以肯定地说,它是一个ActionListener,因为引用类型就是这样。一个实现ActionListener的新匿名内部类对象。对于匿名内部类,很明显您将实现一些接口,因此我觉得implements关键字不是必需的。那么我们实际创建的是什么实例?@user1389813您正在传递给addActionListener方法的实例。它实际上不需要显式声明的类型,因为您再也不会使用它了。编译器只是填写一些占位符名称。它只是使用您内联定义的覆盖实现ActionListener的类。可以肯定地说,它是一个ActionListener,因为引用类型就是这样。一个实现ActionListener的新匿名内部类对象。对于匿名内部类,很明显您将实现一些接口,因此我觉得implements关键字不是必需的。