¿Cómo puedo usar una instancia de clase interna de otro método de clase interna?

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

  •  05-07-2019
  •  | 
  •  

Pregunta

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();
    }
}
¿Fue útil?

Solución

Su problema es que necesita llamar i1.bar () dentro de una función. Por ejemplo

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

En el futuro, es posible que las personas puedan ser más útiles si incluyes el error que obtienes en tu pregunta, lo que haré ahora. Cuando intenta compilar el código a su manera, aparece un error que se parece a

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

Esto se debe a que lo único que puede hacer fuera de un método (como lo tenía originalmente) es declarar variables. Así que esperaba un " identificador " por lo que significó " el nombre de la variable que está declarando " ;. Así que si hubieras dicho

String s;

entonces s habría sido el identificador.

Otros consejos

Algunas cosas están mal aquí;

  • tu inner2 necesita estar llamando al i1 dentro de una función
  • ya que no declaraste inner1 estática necesita una instancia de la adjuntando Ex7 a existir.

Para que puedas hacer algo como esto:

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();
        }
    }
}

Para acceder al i1 del Ex7.

Donde tu instancia de Ex7 contiene un inner1 y un inner2 y tu referencia desde interior2 es inner2 - > parentEx7 - > child inner1.

Si crea la clase interna estática, puede eliminar la referencia Ex7, ya que está definiendo que la clase interna no necesita una instancia de la clase externa para existir.

pero no hay ningún método en la clase Ex7Inner2. crear método con 'i1.bar ();' Llama al interior y compila ok

Ex7Inner1 necesita una referencia a Ex7 para crear una instancia. Desde Ex7Inner2 esa referencia es Ex7.this .

Así decir

Ex7Inner1 i1 = Ex7.this.new Ex7Inner1()

Consulte el Tutorial de Java para obtener más información. .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top