抽象类的实例

时间:2013-08-26 07:07:02

标签: java

你能否澄清一下为什么会这样做:

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节)。

4 个答案:

答案 0 :(得分:21)

您可能没有注意到差异:

new AbstractClassCreationTest(){};

new AbstractClassCreationTest();

额外的{}是扩展抽象类的新的无名类的主体。您已创建anonymous class的实例,而不是抽象类的实例。

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

答案 1 :(得分:7)

注意:

之间的区别
 AbstractClassCreationTest acct = new AbstractClassCreationTest(){};//case 1

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

case1 anonymous class定义。你实例化一个抽象类;相反,您正在实例化所述抽象类的 subType

答案 2 :(得分:3)

这里你没有创建AbstractClassCreationTest类的对象,实际上你正在创建一个扩展AbstractClassCreationTest类的匿名内部类的对象。这是因为你写了new AbstractClassCreationTest(){} not new AbstractClassCreationTest() 您可以从here

了解有关匿名内部类的更多信息

答案 3 :(得分:0)

无法实例化抽象类。

您必须创建一个扩展类,扩展一个抽象类,并将此新类化。

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();
}

我发布了this。对你有用。祝你有愉快的一天