2008-12-04 6 views
6

Désolé pour le mauvais titre, mais je ne pouvais pas penser à un meilleur.Deux questions sur les classes internes en Java (classe A {class B {}})

Je vais avoir une classe A et une classe B qui est en quelque sorte d'une classe sous A, comme suit:?

(Y at-il en fait un nom correct car il est pas aussi « classe » réservé pour l'héritage?)

class A { 
    int i = 0; 
    class B { 
     int j = 1; 
    } 
} 

class Test { 
    public static void main() { 
     A a = new A(); 
     B b = a.new B(); 
     A c = ??? b ??? // get "a" back 
    } 
} 

de B chaque propriété de A est accessible, donc à la fois, ai et bi, retour 0. maintenant, je me demande s'il est en quelque sorte possible de récupérer l'objet original de type A sur de b, comme b contient tout ce que contient? Le casting simple ne semble pas faire l'affaire.

seconde:

class A { 

    void print() { 
     System.out.println("This is class A."); 
    } 

    class B { 
     void print() { 
      // <--- How to access print() of class A (like this.A.print() or smth)? 
      System.out.println("This is class B."); 
     } 
    } 
} 

Vous pourriez aussi aussi me fournir quelques bonnes ressources sur ce sujet, comme je l'ai été trop stupide pour trouver un bon jusqu'à présent.

Merci d'avance. :)

+0

Le nom correct est classe interne, je crois. – tvanfosson

+0

Je crois qu'il s'agit d'un doublon de cette question (http://stackoverflow.com/questions/309737/how-to-refer-to-the-outer-class-in-another-instance-of-a-non- static-inner-class) –

+0

Merci Dan, cela m'a beaucoup aidé!:) – balu

Répondre

20

Il ne semble pas être un moyen d'accéder à la classe extérieure de l'extérieur. Mais vous pouvez le faire comme ceci:

class A { 
    int i = 0; 
    class B { 
     final A outer = A.this; 
     int j = 1; 
    } 
} 

class Test { 
    public static void main() { 
     A a = new A(); 
     A.B b = a.new B(); 
     A c = b.outer // get "a" back 
    } 
} 

ClassName.this sera l'instance de la outerclass associée à l'instance d'une classe interne.

+0

Je pense que B b = ... est faux. Vous ne pouvez pas déclarer une réf de type B sans utiliser AAB b = ... Serait mieux .. – OscarRyz

+0

oui je le pensais aussi –

+0

Je ferais la déclaration 'final A outer = A.this;' être du bon côté –

2

[Edit:. Ma réponse est appropriée pour les programmeurs C#, mais je ne peux pas garantir que son applicable à Java]

B est une classe interne, et non une sous-classe de A. De plus, B ne pas tenir une instance de a, de sorte que votre code comme est ne peut retourner une instance de A.

Vous devez restructurer vos classes comme suit:

class A 
{ 
    public class B 
    { 
     public A Parent; 
     public B(A parent) 
     { 
      this.Parent = parent; 
     } 
    } 
} 

maintenant votre classe B a un champ « Parent 'qui renvoie son parent. Vous pouvez utiliser ces classes comme suit (ce qui est C syntaxe #, parce que je ne sais pas si Java a une syntaxe différente pour instancier les classes internes):

public static void Main(String[] args) 
{ 
    A parent = new A(); 
    A.B child = new A.B(child); 
    A backToParent = child.Parent; 
} 

Bien sûr, la création de votre classe B de cette façon semble peu drôle: techniquement, vous pouvez passer dans n'importe quel parent. Il serait sans doute préférable de réécrire votre classe A avec une méthode qui retourne un B:

class A 
{   
    public class B 
    { 
     public A Parent; 
     public B(A parent) 
     { 
      this.Parent = parent; 
     } 
    } 

    public B getChild() 
    { 
     return new B(this); 
    } 
} 

public static void Main(String[] args) 
{ 
    A parent = new A(); 
    A.B child = A.getChild(); 
    A backToParent = child.Parent; 
} 
+0

En fait, il contient une instance de A. Voir aussi: http://stackoverflow.com/questions/309737/how-to-refer-to-the-outer-class-in-another-instance-of-a -non-static-inner-class Cependant, merci pour votre réponse. La façon dont vous avez décrit est certainement une autre solution. – balu

+1

Il semble que "classe interne" se réfère à un concept différent de Java (à peu près ce que Java appelle "classe imbriquée"). –

7

Vous pouvez y accéder avec la syntaxe ParentClass.this à partir de la classe interne.

par exemple.

public class Outter 
{ 
    class Inner { 
     public Outter getOutter() 
     { 
      return Outter.this; 
     } 
    } 

    public Inner getInner(){ 
     return new Inner(); 
    } 
} 

class Runner{ 
    public static void main(String[] args){ 
     Outter out = new Outter(); 
     Outter.Inner inner = out.getInner(); 

     System.out.println(inner.getOutter().toString()); 
    } 
} 
1

cela semblait fonctionner pour moi

class A { 
    int i = 0; 
    class B { 
     int j = 1; 
    } 
} 

class Test { 
    public static void main() { 
     A a = new A(); 
     A.B b = a.new B(); 
     A c = (A)b.getClass().getDeclaredField("this$0").get(b); 
    } 
} 
Questions connexes