Comment utiliser une instance de classe interne à partir d'une autre méthode de classe interne?

StackOverflow https://stackoverflow.com/questions/1406525

  •  05-07-2019
  •  | 
  •  

Question

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();
    }
}
Était-ce utile?

La solution

Votre problème est que vous devez appeler i1.bar () dans 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 constaterez peut-être que les gens pourront être plus utiles si vous incluez l'erreur que vous obtenez dans votre question, ce que je ferai maintenant. Lorsque vous essayez de compiler le code à votre façon, vous obtenez une erreur qui ressemble à

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

En effet, la seule chose que vous puissiez faire en dehors d’une méthode (comme vous l’aviez initialement) est de déclarer des variables. Nous nous attendions donc à un " identifiant " cela signifie "le nom de la variable que vous déclarez". Donc, si vous aviez dit

String s;

alors s aurait été l'identifiant.

Autres conseils

Quelques erreurs ici;

  • votre inner2 doit appeler le i1 à l'intérieur d'une fonction
  • puisque vous n'avez pas déclaré inner1 statique, il faut une instance de la enfermant Ex7 pour exister.

Vous pouvez donc 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 à l'i1 de l'Ex7.

Où votre instance Ex7 contient un inner1 et un inner2 et votre référence à l'intérieur de inner2 est inner2 - > parentEx7 - > child inner1.

Si vous rendez 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.

mais il n'y a pas de méthode dans la classe Ex7Inner2. Méthode create avec 'i1.bar ();' appeler à l'intérieur et il compile ok

Ex7Inner1 a besoin d'une référence à Ex7 pour pouvoir instancier. De Ex7Inner2 , cette référence est Ex7.this .

Disons donc

Ex7Inner1 i1 = Ex7.this.new Ex7Inner1()

Voir le Didacticiel Java pour plus d'informations. .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top