2011-03-01 104 views
3
abstract class Two { 
    Two() { 
     System.out.println("Two()"); 
    } 
    Two(String s) { 
     System.out.println("Two(String"); 
    } 
    abstract int display(); 
} 
class One { 
    public Two two(String s) { 
     return new Two() {   
      public int display() { 
       System.out.println("display()"); 
       return 1; 
      } 
     }; 
    } 
} 
class Ajay { 
    public static void main(String ...strings){ 
     One one=new One(); 
     Two two=one.two("ajay"); 
     System.out.println(two.display()); 
    } 
} 

我們不能實例化一個抽象類,那麼爲什麼是功能二兩(String s)將能夠創建抽象類兩個的實例????抽象類和匿名類

回答

9

它不創建抽象Two的實例。它創建一個具體的匿名類,擴展Two並實例化它。

這幾乎等同於使用一個名爲內部類是這樣的:

class One { 
    public Two two(String s) { 
     return new MyTwo(); 
    } 

    class MyTwo extends Two { 
     public int display() { 
      System.out.println("display()"); 
      return 1; 
     } 
    } 
} 
+2

[停止預讀我的思想](http://stackoverflow.com/questions/5154740/abstract-class-and-anonymous-class/5154764#5154764)! – 2011-03-01 12:55:08

+0

有沒有辦法讓MyTwo Anonymous? – 2011-08-25 14:37:40

+0

@Usman是的,這就是原始海報的問題所在。 – 2011-08-26 07:28:10

2

因爲它實現了丟失的功能顯示()。它返回Two的匿名子類。你可以看到這個,如果你看看編譯的文件。你將有一個One $ 1.class,它擴展了Two.class!