[英]Java initializing abstract classes
有人可以为我解释这行代码吗?
SomeAbstractClass variable = new SomeAbstractClass() { };
这适当地实例化并将抽象实例存储在变量中。 怎么了? 可能是一个扩展抽象类的匿名类? 我可以使用任何关键字查找有关此信息? (如果有任何相关性,抽象类也恰好是通用的)
上面的一行是创建SomeAbstractClass
的匿名子类,它不是abstract
。 当然,只有在基类没有要实现的abstract
方法的情况下,这才有效。
实际上,我无法想象上面一行中有用的实例(除了“文档”功能,请参阅下面的注释),除非您在花括号之间实现和/或覆盖方法。 如果基类/接口碰巧有很少的方法要实现并且实现很简单,那么这是一种非常常见的技术。 您甚至可以参考周围方法和参数的final
变量,从而形成闭包。
您正在创建一个匿名类,它是abstract
类的子类。 就像评论中指出的那样,你正在寻找匿名扩展。
如果你有abstract
方法要实现,那么像下面这样的东西会起作用:
MyAbstractClass someObjectOfThatClass = new MyAbstractClass(){
@Override
public void someAbstractMethod(){
}
}
您可以对接口执行相同的操作,因为它们也可以包含abstract
方法。 一个实际的例子是将一个ActionListener
添加到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
没有抽象方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.