2011-03-01 110 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!