有人可以为我解释这行代码吗?
SomeAbstractClass variable = new SomeAbstractClass() { };
这会正确地实例化抽象实例并将其存储在变量中。怎么了?一个扩展抽象类的匿名类,也许吧?我可以使用任何关键字来查找有关此信息的信息吗?(如果有任何相关性,抽象类也恰好是通用的)
有人可以为我解释这行代码吗?
SomeAbstractClass variable = new SomeAbstractClass() { };
这会正确地实例化抽象实例并将其存储在变量中。怎么了?一个扩展抽象类的匿名类,也许吧?我可以使用任何关键字来查找有关此信息的信息吗?(如果有任何相关性,抽象类也恰好是通用的)
上面的行正在创建 的匿名子类SomeAbstractClass
,但不会abstract
。当然,这只有在基类没有abstract
要实现的方法时才有效。
实际上,除非您在花括号之间实现和/或覆盖方法,否则我无法想象上述行的有用实例(除了“文档”功能,请参见下面的评论)。如果基类/接口碰巧有很少的方法可以实现并且实现很简单,那么这是一种非常常见的技术。您甚至可以引用final
周围方法和参数的变量,从而进行闭包。
您正在创建一个匿名类,它是您的类的子abstract
类。就像评论中指出的那样,您正在查看匿名扩展。
如果您有实现方法,则如下所示的方法会起作用abstract
:
MyAbstractClass someObjectOfThatClass = new MyAbstractClass(){
@Override
public void someAbstractMethod(){
}
}
您可以对接口执行相同的操作,因为它们也可以包含abstract
方法。一个实际的例子是将 a 添加ActionListener
到 a JButton
:
myJButton.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
// code
}
});
Java 使您能够内联创建匿名子类。您经常在使用 Swing 事件处理的匿名内部类的上下文中看到这一点,但也有许多其他应用程序。
在您的示例中,您正在创建一个SomeAbstractClass
匿名扩展的类并将其分配给SomeAbstractClass
引用。就好像您创建了一个这样的单独类
public class SomeConcreteClass extends SomeAbstractClass {
}
后来做了这个
SomeAbstractClass variable = new SomeConcreteClass();
正如@Stefano 所指出的,您的方法仅在您的匿名具体类没有抽象方法时才有效,这是正确的,因为SomeAbstractClass
没有抽象方法。