9

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

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

4 回答 4

21

您可能没有注意到其中的区别:

new AbstractClassCreationTest(){};

相对

new AbstractClassCreationTest();

这个额外{}的部分是一个新的、无名的类的主体,它扩展了抽象类。您创建了一个匿名类的实例,而不是抽象类的实例。

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

于 2013-08-26T07:09:49.163 回答
7

注意两者之间的区别:

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

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

case1是一个匿名类定义。您没有实例化抽象类;相反,您正在实例化所述抽象类的子类型。

于 2013-08-26T07:10:02.577 回答
3

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

于 2013-08-26T07:11:05.110 回答
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();
}

我张贴这个。可以对你有用。祝你今天过得愉快

于 2013-08-26T07:09:26.397 回答