2009-09-10 6 views
1
public class Ex7 { 
    private int fld; 

    private void meth(int val) { 
     fld = val; 
     System.out.println(" meth() -> fld = " + fld); 
    } 

    public class Ex7Inner1 { 
     void operateOnFld() { 
      fld = 12; 
     } 

     void operateOnMeth() { 
      meth(10); 
     } 

     public void bar() { 
      System.out.println(" bar() "); 
     } 
    } 

    class Ex7Inner2 { 
     Ex7Inner1 i1 = new Ex7Inner1(); 
     // how to call i1.bar() ?? 
     i1.bar(); 
    } 
} 
+0

Avez-vous essayé? Qu'est-il arrivé? Je ne l'ai pas essayé, mais j'ai des doutes sur le fait que votre classe publique sera en fait publique, mais cela devrait fonctionner. –

+0

la réponse n'a en fait rien à voir avec les classes internes, c'est une erreur de syntaxe de base. – skaffman

+0

J'ai raté le problème avec Ex7Inner2. J'attends qu'Eclipse démarre. –

Répondre

8

Votre problème est que vous devez appeler i1.bar() à l'intérieur d'une fonction. Par exemple

class Ex7Inner2 { 
    Ex7Inner1 i1 = new Ex7Inner1(); // this is now a field of the Ex7Inner2 class 
    public void callBar() { 
     i1.bar();     // this will work 
    } 
} 

À l'avenir, vous pouvez constater que les gens peuvent être plus utiles si vous incluez l'erreur que vous obtenez dans votre question, que je vais le faire maintenant. Lorsque vous essayez de compiler le code votre chemin, vous obtenez une erreur qui ressemble

Ex7.java:26: <identifier> expected 
    i1.bar(); 
     ^
1 error 

Ceci est parce que la seule chose que vous pouvez faire en dehors d'une méthode (comme vous l'aviez à l'origine) est déclarer des variables. Donc, il attendait un "identifiant" par lequel il signifiait "le nom de la variable que vous déclarez". Donc, si vous aviez dit

String s; 

alors s aurait été l'identificateur.

+1

maintenant je sens que c'était une question stupide .. comment aurais-je pu écrire un tel code? –

+0

Haha, je me retrouve souvent à poser la même question sur mon propre code. Ne le laissez pas tomber, vous n'êtes pas seul! –

0

Quelques petites erreurs ici;

  • votre inner2 doit être appeler la à l'intérieur d'une i1 fonction
  • puisque vous n'avez pas déclaré inner1 statique, il a besoin d'une instance de la renfermant Ex7 d'exister.

Ainsi, vous pouvez faire quelque chose comme ceci:

public class Ex7 { 

    private Ex7Inner1 i1; 
    public class Ex7Inner1 { 
     public void bar() { 
      System.out.println(" bar() "); 
     } 
    } 

    class Ex7Inner2 { 
     // how to call i1.bar() ?? 
     public Ex7Inner2() { 
      Ex7.this.i1.bar(); 
     } 
    } 
} 

Pour accéder au Ex7 du i1. Où votre instance Ex7 contient un inner1 et un inner2 et votre référence de inside2 est inner2 -> parentEx7 -> child inner1.

Si vous définissez la classe interne statique, vous pouvez supprimer la référence Ex7, car vous définissez que la classe interne n'a pas besoin d'une instance de la classe externe pour exister.

0

mais il n'existe aucune méthode dans la classe Ex7Inner2. Crée une méthode avec 'i1.bar();' appeler à l'intérieur et il compile ok

0

Ex7Inner1 besoin d'une référence à Ex7 afin d'instancier. De Ex7Inner2 cette référence est Ex7.this.

parleras ainsi

Ex7Inner1 i1 = Ex7.this.new Ex7Inner1() 

Voir la Java Tutorial de plus d'informations.

Questions connexes