Java初始化抽象类

Java初始化抽象类,java,initialization,abstract-class,Java,Initialization,Abstract Class,有人能给我解释一下这行代码吗 SomeAbstractClass变量=新的SomeAbstractClass(){} 这将正确地实例化抽象实例并将其存储在变量中。发生了什么事?可能是一个扩展抽象类的匿名类?我可以用什么关键字来查找关于这个的信息?(如果有任何关联,抽象类也恰好是泛型的)上面的一行正在创建SomeAbstractClass的匿名子类,该子类将不是abstract。当然,只有当基类没有要实现的abstract方法时,这才有效 实际上,我无法想象上面这一行的有用实例(除了“文档”特性之

有人能给我解释一下这行代码吗

SomeAbstractClass变量=新的SomeAbstractClass(){}


这将正确地实例化抽象实例并将其存储在变量中。发生了什么事?可能是一个扩展抽象类的匿名类?我可以用什么关键字来查找关于这个的信息?(如果有任何关联,抽象类也恰好是泛型的)

上面的一行正在创建
SomeAbstractClass
的匿名子类,该子类将不是
abstract
。当然,只有当基类没有要实现的
abstract
方法时,这才有效


实际上,我无法想象上面这一行的有用实例(除了“文档”特性之外,请参见下面的注释),除非您在大括号之间实现和/或重写方法。如果基类/接口恰好有很少的方法要实现并且实现很简单,那么这是一种非常常见的技术。您甚至可以引用周围方法和参数的
final
变量,从而进行闭包。

您正在创建一个匿名类,它是
抽象类的子类。正如在评论中指出的,您正在查看一个匿名扩展

如果您有
abstract
方法来实现,下面这样的方法就可以了:

MyAbstractClass someObjectOfThatClass = new MyAbstractClass(){
                       @Override
                       public void someAbstractMethod(){

                       }
                    }  
您可以对接口执行相同的操作,因为它们还可以包含
抽象方法。一个实际的例子是将
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
没有抽象方法。

您问题中的关键字是匿名和扩展的。我在单元测试中的模拟对象中看到过它,实际应用程序应始终使用派生类<代码>抽象
在这种情况下,更多的是一种文档功能和警告,以避免创建基类的实例,而不是实现所必需的。@kiheru nice。我在答案中添加了一个指向您的注释的指针。要引用周围方法中的变量,它们也必须是
final
。即使是这样,匿名内部类也只能有效地进行闭包。这并不是真正的结束。@StefanoSanfilippo我想一点幽默会管用的