2014-09-13 1 views
2
interface A { 
    void show(); 
} 

public class Static { 
    public static void main(String args[]) { 
     A a = new A(){ 
      public void show(){ 
       System.out.println("In anonymous Class"); 
       A b =new A(){ 
        public void show(){ 
         System.out.println("In nested Anonymous Class"); 
        } 
       }; 
      } 
     }; 
     //a.show(); 
    } 
} 

Si je veux imprimer "In Anonymous Nested Class", que dois-je utiliser à la place de a.show()?Existe-t-il un moyen d'accéder à une classe anonyme dans une autre classe anonyme?

// PLUS TARD ÉDITÉE

Merci les gars, mais malheureusement mal typé code .... Je ne voulais pas classe anonyme à l'intérieur d'une méthode ... mais à l'intérieur de la classe elle-même. Désolé pour l'erreur. Voici le code corrigé

interface A { 
    void show(); 
} 

public class Static { 
    public static void main(String args[]) { 
     A a = new A() { 
      public void show() { 
       System.out.println("In anonymous Class"); 
      }; 

      A b = new A() { 
       public void show() { 
        System.out.println("In nested Anonymous Class"); 
       } 
      }; 
     }; 
     a.show(); 
    } 
} 

Répondre

1

Normalement, il est impossible, puisque A est une interface et les interfaces n'ont pas de champs. Cependant, il est possible d'accéder à ce champ en utilisant la réflexion. C'est un peu un hack cependant et je ne suggérerais pas d'utiliser ceci dans le "vrai monde"!

interface A { 
    void show(); 
} 

public class Static { 
    public static void main(String args[]) throws IllegalArgumentException, IllegalAccessException, SecurityException, NoSuchFieldException { 
     A a = new A() { 
      public void show() { 
       System.out.println("In anonymous Class"); 
      }; 

      public A b = new A() { 
       public void show() { 
        System.out.println("In nested Anonymous Class"); 
       } 
      }; 

     }; 
     // Get the anonymous Class object 
     Class<? extends A> anonymousClass = a.getClass(); 
     // Get field "b" 
     Field fieldB = anonymousClass.getField("b"); 
     // Get the value of b in instance a and cast it to A 
     A b = (A) fieldB.get(a); 
     // Show! 
     b.show(); 
    } 
} 

Remarque: un meilleur moyen pourrait être de simplement déclarer un getter sur votre interface pour la variable b.

0

faire un appel à b.show(); juste après déclaration de classe.

   A b =new A(){ 
        public void show(){ 
         System.out.println("In nested Anonymous Class"); 
        } 
       }; 
       b.show(); 
0

Il n'y a rien que vous devez utiliser à la place de a.show(). Cette ligne devrait être où vous l'avez mis, et non commentée. De plus vous avez besoin b.show() intérieur:

public static void main(String args[]) { 
    A a = new A(){ 
    public void show(){ 
     System.out.println("In anonymous Class"); 
     A b =new A(){ 
     public void show(){ 
      System.out.println("In nested Anonymous Class"); 
     } 
     }; 
     b.show(); 
    } 
    }; 
    a.show(); 
}