2013-08-26 182 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匿名內部類