Java初始化抽象类

时间:2013-10-26 15:07:28

标签: java initialization abstract-class

有人可以为我解释这行代码吗?

SomeAbstractClass variable = new SomeAbstractClass() { };

这适当地实例化并将抽象实例存储在变量中。怎么了?可能是一个扩展抽象类的匿名类?我可以使用任何关键字查找有关此信息? (如果有任何相关性,抽象类也恰好是通用的)

3 个答案:

答案 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没有抽象方法。