关于java:抽象类的实例

Instance of an abstract class

本问题已经有最佳答案,请猛点这里访问。

你能解释一下为什么这样做有效吗?

1
2
3
4
5
6
7
8
9
10
11
public abstract class AbstractClassCreationTest {

    public void hello(){
        System.out.println("I'm the abstract class' instance!");
    }

    public static void main(String[] args) {
        AbstractClassCreationTest acct = new AbstractClassCreationTest(){};
        acct.hello();
    }
}

我想这与我们能找到的规范相矛盾:

如果试图创建抽象实例,则是编译时错误使用类实例创建表达式(§15.9)初始化。


您可能没有注意到区别:

1
new AbstractClassCreationTest(){};

对战

1
new AbstractClassCreationTest();

这个额外的{}是一个新的、没有名字的类的主体,它扩展了抽象类。您已经创建了一个匿名类的实例,而不是抽象类的实例。

现在继续在抽象类中声明一个抽象方法,观察编译器如何强制您在匿名类的{}中实现它。


注意以下两者之间的区别:

1
2
3
 AbstractClassCreationTest acct = new AbstractClassCreationTest(){};//case 1

 NonAbstractClassCreationTest acct = new NonAbstractClassCreationTest();//case 2

case1是一个匿名类定义。您不是在实例化抽象类;而是在实例化所述抽象类的子类型。


这里你不是在创建AbstractClassCreationTest类的对象,实际上你是在创建一个匿名内部类的对象,扩展AbstractClassCreationTest类,这是因为你写了new AbstractClassCreationTest(){} not new AbstractClassCreationTest()类。你可以从这里了解更多关于匿名内部类的信息


无法实例化抽象类。

您必须创建一个扩展类来扩展抽象类,从而使这个新类独立。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public abstract class AbstractClassCreationTest {

    public void hello(){
        System.out.println("I'm the abstract class' instance!");
    }
}

public class MyExtClass extends AbstractClassCreationTest() {
}

public static void main(String[] args) {
    MyExtClass acct = new MyExtClass(){};
    acct.hello();
}

我张贴这个。对你有用。祝你今天愉快