2013-05-28 46 views
9

這裏的代碼如何創建抽象類或匿名類的對象? 請告訴我我在這裏有點迷惑。創建抽象類或匿名類的實例

public abstract class AbstractDemo { 

    abstract void showMessage(); 
    abstract int add(int x,int y); 

    public int mul(int x,int y){ 
     return x+y; 
    } 


    public static void main(String[] args) { 
     AbstractDemo ad = new AbstractDemo() { 

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

      } 

      @Override 
      int add(int x, int y) { 
       // TODO Auto-generated method stub 
       return 0; 
      } 
     }; 

     System.out.println(ad.mul(10, 12)); 
     System.out.println(ad.getClass()); 
    } 

} 
+0

您是否嘗試編譯此代碼?結果是什麼? – 2013-05-28 07:16:57

+2

請注意,您正在重寫抽象方法。這是一個匿名課程。 – Lion

+0

輸出是22 class com.mj.javademo.AbstractDemo $ 1 – DroidNinja

回答

23

您創建一個匿名擴展您的抽象類。

在下面的截圖中,您將擴展AbstractDemo並提供其抽象方法的實現。

new AbstractDemo() { 
    @Override 
    void showMessage() { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    int add(int x, int y) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 
}; 
+1

感謝兄弟 – DroidNinja

0

覆蓋在anonymous class ..that就是爲什麼你可以創建對象abstract methods。見下文。

 @Override // Here 
     void showMessage() { 
      // TODO Auto-generated method stub 

     } 

     @Override // here 
     int add(int x, int y) { 
      // TODO Auto-generated method stub 
      return 0; 

實施Abstract Class可以爲你做實例化。

+0

謝謝..是的.. – DroidNinja

4

您無法創建抽象類的實例。
您可以創建一個擴展抽象類的類的實例。

抽象類的全部要點是它是抽象的 - 您定義了一個接口但不是實現。如果沒有實現,實例化類將不會產生有意義的或有用的結果。如果它確實/有意義地實例化該類的對象,那麼你根本不希望首先使用抽象類。

您可以使用匿名類概念的實例,如下面:

AbstractDemo abstractDemo = new AbstractDemo() { 
      @Override 
      void showMessage() { 
       // TODO Auto-generated method stub 
      } 
      @Override 
      int add(int x, int y) { 
       // TODO Auto-generated method stub 
       return 0; 
      } 
     }; 
+1

我現在明白了很好的答案。 – DroidNinja

0

一個獨立的抽象類的對象不能進行,但可以進行匿名抽象類對象,因爲它是提供實現,那麼和那裏。

Java不允許抽象類對象的原因是,因爲它沒有任何方法或一些方法的實現,所以你怎麼能有一個不完整的類的對象。但在匿名的方式,你在這裏給它實施,所以它可以讓你有一個對象。

與接口

AbstractDemo ad = new AbstractDemo() { 

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

      } 

      @Override 
      int add(int x, int y) { 
       // TODO Auto-generated method stub 
       return 0; 
      } 
     }; 

同一案件這裏AbstractDemo類是抽象的,但它的實現類可以有對象,因此,在這裏匿名類代碼被執行的代碼,因此這是完全允許有對象。

更多挖進去,看下面的代碼,MyAbstractClass是一個抽象類,現在如果你註釋掉

abstract void play(); 

然後正常工作,Java正在讓使這個抽象類的對象,但是當你取消註釋,因爲它沒有任何有關該方法的實現,所以拒絕提供對象。

abstract class MyAbstractClass { 
    private String name; 

    public MyAbstractClass(String name) 
    { 
     this.name = name; 
    } 

    public String getName(){ 
     return this.name; 
    } 
    abstract void play(); 



} 


public class Test2 { 

    public static void main(String [] args) 
    { 
     MyAbstractClass ABC = new MyAbstractClass("name") { 
     }; 

     System.out.println(ABC.getName()); 
    } 

} 

仔細檢查它是{}構造函數調用後,這意味着不再需要進一步的實現,也可以覆蓋其方法或以上的一個。

+0

輸出是com.mj.javademo.AbstractDemo $ 1所以這意味着這是指哪個對象? – DroidNinja

4

這裏是在這短暫的和無辜的代碼發生了什麼:

AbstractDemo ad = new AbstractDemo() { 

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

      } 

      @Override 
      int add(int x, int y) { 
       // TODO Auto-generated method stub 
       return 0; 
      } 
     }; 
  1. 新的類定義(沒有名字,所謂的匿名類)
  2. 這個新類擴展AbstractDemo
  3. AbstractDemo的抽象方法在此新類別中被覆蓋
  4. t的新實例他的新類是創建並分配給ad變量

閱讀的Java here更多anonymous classes

+1

非常棒的解釋。 – SAM

0

AbstractDemo抽象方法在匿名類中實現後不再抽象。其良好的話說:

Class AbstractDemoImpl extends AbstractDemo { 

    void showMessage() { 
      // TODO Auto-generated method stub 
    } 
    int add(int x, int y) { 
      // TODO Auto-generated method stub 
      return 0; 
    } 
} 
0

在這裏,我們提供抽象class.By的實施,我們正在對象的時候,我們提供它的實現,並覆蓋所有的抽象methods.In只具有抽象類的情況下,具體方法。 見例

下面
abstract class MyAbstractClass { 
    private String name; 

    public MyAbstractClass(String name) 
    { 
     this.name = name; 
    } 

    public String getName(){ 
     return this.name; 
    } 
} 

public class Test { 

    public static void main(String [] args) 
    { 
     MyAbstractClass ABC = new MyAbstractClass("name") { 
     }; 

     System.out.println(ABC.getName()); 
    } 
} 

這裏我們使用調用構造函數只是把對象像{}。

  1. 我們正在證明使用匿名類的實現。

2.什麼是沒有名字的類,只有當我們做一個物體時,我們需要做的就是名字。

  1. 是的,我們通過在運行時驗證實現來創建抽象類的對象。

4.它爲什麼抽象類允許構造函數打開答案?但我們不能創建它的一個對象。

5.與抽象類有關的另一個問題是我們可以在抽象類中只有靜態塊。這是什麼意思?

6.只有靜態塊,因爲我們只想加載一次而不擴展和創建它的對象。

7.編譯後的代碼用於獲取每個具體類,抽象類或接口的.class。

8.下一個問題出現在這裏爲什麼java的人不允許在界面中的靜態塊?

1
@Override // Here 
void showMessage() { 
    // TODO Auto-generated method stub 
} 

@Override // here 
int add(int x, int y) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

首先你要知道,你不能爲abstract class創建instance,在這裏你只是創建anonymous class這就好比一個擴展abstract class一個inner class行爲所以它是屬於你的anonymous class