Come posso usare un'istanza di classe interna da un altro metodo di classe interna?

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

  •  05-07-2019
  •  | 
  •  

Domanda

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();
    }
}
È stato utile?

Soluzione

Il tuo problema è che devi chiamare i1.bar () all'interno di una funzione. Ad esempio

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

In futuro potresti scoprire che le persone possono essere più utili se includi l'errore che ricevi nella tua domanda, cosa che farò ora. Quando provi a compilare il codice a modo tuo, ricevi un errore simile a

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

Questo perché l'unica cosa che puoi fare al di fuori di un metodo (come lo avevi originariamente) è dichiarare le variabili. Quindi si aspettava un "identificatore" con cui significava "il nome della variabile che stai dichiarando". Quindi se avessi detto

String s;

allora s sarebbe stato l'identificatore.

Altri suggerimenti

Alcune cose sbagliate qui;

  • il tuo inner2 deve chiamare il i1 all'interno di una funzione
  • poiché non hai dichiarato inner1 statico necessita di un'istanza di allegando Ex7 per esistere.

Quindi puoi fare qualcosa del genere:

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

Per accedere all'i1 di Ex7.

Dove l'istanza di Ex7 contiene un inner1 e un inner2 e il tuo riferimento all'interno di inner2 è inner2 - > parentEx7 - > child inner1.

Se si rende statica la classe interna, è possibile eliminare il riferimento Ex7, poiché si sta definendo che la classe interna non ha bisogno di un'istanza della classe esterna per esistere.

ma non ci sono metodi nella classe Ex7Inner2. crea il metodo con 'i1.bar ();' chiama dentro e si compila ok

Ex7Inner1 ha bisogno di un riferimento a Ex7 per creare un'istanza. Da Ex7Inner2 quel riferimento è Ex7.this .

Così dici

Ex7Inner1 i1 = Ex7.this.new Ex7Inner1()

Vedi Tutorial Java da maggiori informazioni .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top