2013-08-26 44 views
9

Couldy你解释,为什么这个工程:实例化的抽象类

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

抽象类不能实例化。

你必须创建一个扩展类来扩展一个抽象类,以便这个新类很容易理解。

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。可以对你有用。有一个愉快的一天

21

你可能没有注意到的区别:

new AbstractClassCreationTest(){}; 

new AbstractClassCreationTest(); 

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

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

7

通知的区别:

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

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

情形1anonymous class定义。你是而不是实例化一个抽象类;相反,您正在实例化所述抽象类的子类型

+0

当我声明一个匿名类时,但是我不使用抽象类。我不知道如果可能的话。我无法在网上找到任何东西,并且在链接中没有提及抽象类和匿名类之间的链接。 –

3

在这里你是不是创建AbstractClassCreationTest类的对象,其实你正在创建匿名内部类的对象,谁扩展了AbstractClassCreationTest class.This是因为你已经写new AbstractClassCreationTest(){} not new AbstractClassCreationTest() 您可以了解更多关于here匿名内部类