2013-02-20 62 views
2

這很好。實例化抽象類或接口,可能嗎?

package abstracttest; 

public abstract class AbstractClass implements NewInter { 

    public abstract void doStuff(); 

    public void doStuff2() { 
     System.out.println("in doStuff2"); 
    } 

    /* 
    * public static void main(String a[]) { AbstractClass ab = new 
    * AbstractClass() { 
    * 
    * @Override public void doStuff() { // TODO Auto-generated method stub 
    * System.out.println(" doStuff "); } 
    * 
    * @Override public void doInter() { // TODO Auto-generated method stub 
    * 
    * } }; 
    * 
    * ab.doStuff2(); ab.doStuff(); 
    * 
    * NewInter ni = new NewInter() { 
    * 
    * @Override public void doInter() { // TODO Auto-generated method stub 
    * System.out.println("do Inter"); } 
    * 
    * }; ni.doInter(); 
    * 
    * AbstractClass ab1 = new AbstractClass(); } 
    */ 

} 

interface NewInter { 

    String con = "Hell"; 

    void doInter(); 
} 

class Impl extends AbstractClass { 

    @Override 
    public void doInter() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void doStuff() { 
     // TODO Auto-generated method stub 

    } 

    public static void main(String[] s) { 
     AbstractClass ab = new AbstractClass() { 

      @Override 
      public void doInter() { // TODO Auto-generated method stub 
       System.out.println("impl doInter"); 
      } 

      @Override 
      public void doStuff() { // TODO Auto-generated method stub 
       System.out.println("impl doStuff"); 
      } 

     }; 
     ab.doInter(); 
     ab.doStuff(); 

     NewInter ni1 = new NewInter() { 

      @Override 
      public void doInter() { 
       // TODO Auto-generated method stub 

      } 
     }; 
     ni1.doInter(); 
    } 

} 

我能夠從抽象類main()內,並從class Impl實例化abstract classinterface兩者。
這怎麼可能?
我期待着一個異常,但調用工作正常。
有人可以解釋這種現象嗎?我很困惑。

Java抽象類也不能被實例化,但可以在存在main()時調用。

我在blog中讀到這個。這是什麼意思?

是否有任何其他方式調用抽象類的構造函數?如果有,請告訴我。

+0

有沒有理由試圖做到這一點,或者這純粹是一個學術問題? – 2013-02-20 09:40:24

回答

8

如果我這樣做:

new AbstractClass() { 
    public void methodToImplement() { 
    } 
} 

它創建一個匿名類從抽象類派生。它被稱爲(匿名),因爲類定義沒有它自己的可訪問名稱,並且不能再次訪問該定義。定義/實例化一起出現,例如

AbstractClass ac = new AbstractClass() { 
    ... 
} 

(這是一個子類的AbstractClass

注意,您可以對這兩種接口和抽象類做到這一點,但你必須適當地執行所需的方法。

上面通常用於以簡潔的形式實現簡單的接口/抽象類,通常用作回調中的內部類。有關更多信息,請參閱this SO question,有關更多信息,請參閱Nested Class tutorial

+1

謝謝你的解釋。你能解釋一下嗎?一個Java抽象類不能被實例化,但是如果main()存在,可以調用**;第7點,在[博客](http://javapapers.com/core-java/abstract-and-interface-core-java-2/difference-between-a-java-interface-and-a-java-抽象類/)? – Freakyuser 2013-02-21 09:05:22

+2

我認爲這意味着你可以有一個* static * main()方法,並從命令行運行com.example.AbstractClass。請注意,* not *實例化類的實例,因爲主要方法是靜態的 – 2013-02-21 10:33:52

14

不,你沒有實例化它們。您只創建了實現接口或擴展抽象類的匿名類。這些匿名類類型的對象實際上是實例化的。

+0

他已經實例化了他們,不是嗎? ni1 = new NewInter()... – 2013-02-20 09:43:37

+0

更新了答案。 – 2013-02-20 09:45:26

+0

這是一個美妙的解釋。現在我明白我們是抽象類的子類而不是創建一個實例。但是你能解釋一下這個問題嗎?Java抽象類也不能被實例化,但是如果main()存在,就可以調用它。**我已經在問題中提到了它。 – Freakyuser 2013-02-20 09:53:56