4

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

SomeAbstractClass variable = new SomeAbstractClass() { };

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

4

3 回答 3

8

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

实际上,除非您在花括号之间实现和/或覆盖方法,否则我无法想象上述行的有用实例(除了“文档”功能,请参见下面的评论)。如果基类/接口碰巧有很少的方法可以实现并且实现很简单,那么这是一种非常常见的技术。您甚至可以引用final周围方法和参数的变量,从而进行闭包。

于 2013-10-26T15:09:01.150 回答
1

您正在创建一个匿名类,它是您的类的子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
                }
            });
于 2013-10-26T15:14:44.020 回答
1

Java 使您能够内联创建匿名子类。您经常在使用 Swing 事件处理的匿名内部类的上下文中看到这一点,但也有许多其他应用程序。

在您的示例中,您正在创建一个SomeAbstractClass匿名扩展的类并将其分配给SomeAbstractClass引用。就好像您创建了一个这样的单独类

public class SomeConcreteClass extends SomeAbstractClass {
}

后来做了这个

SomeAbstractClass variable = new SomeConcreteClass();

正如@Stefano 所指出的,您的方法仅在您的匿名具体类没有抽象方法时才有效,这是正确的,因为SomeAbstractClass没有抽象方法。

于 2013-10-26T15:16:57.303 回答