2011-03-01 6 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()); 
    } 
} 

nous ne pouvons pas instancier une classe abstraite alors pourquoi est la fonction Deux deux (String s) en mesure de créer une instance de la classe abstraite Deux ????classe abstraite et classe anonyme

Répondre

9

Il ne crée pas une instance du résumé Two. Il crée une classe concrète et anonyme qui s'étend Two et l'instancie.

Il est presque équivalent à l'aide d'une classe interne nommée comme ceci:

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

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

[Arrêtez de pré-lire mon esprit] (http://stackoverflow.com/questions/5154740/abstract-class-and-anonymous-class/5154764#5154764)! –

+0

Existe-t-il un moyen de créer MyTwo Anonymous? –

+0

@Usman Oui, c'est ce que fait la question du poster original. –

2

Parce qu'il met en œuvre l'affichage de la fonction manquante(). Il retourne une sous-classe anonyme de Two. Vous pouvez le voir si vous regardez les fichiers compilés. Vous aurez là un One $ 1.class, ce qui étend Two.class!