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