Wie kann ich eine innere Klasse Instanz von einer anderen inneren Klassenmethode verwenden?

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

  •  05-07-2019
  •  | 
  •  

Frage

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();
    }
}
War es hilfreich?

Lösung

Ihr Problem ist, dass Sie i1.bar() innerhalb einer Funktion aufrufen müssen. Zum Beispiel

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

In Zukunft können Sie feststellen, dass Menschen in der Lage sind hilfreicher zu sein, wenn Sie den Fehler enthalten, die Sie in Ihrer Frage zu bekommen, was ich jetzt tun würde. Wenn Sie versuchen, den Code Ihren Weg zu kompilieren, erhalten Sie einen Fehler, der wie

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

Das ist, weil das einzige, was Sie außerhalb eines Verfahrens tun kann (wie Sie es ursprünglich hatte) erklären Variablen ist. So wurde es erwartet, eine „Kennung“, durch die sie „den Namen der Variablen, die Sie deklarieren“ gemeint. Also, wenn Sie hatte gesagt

String s;

dann würde s die Kennung gewesen sein.

Andere Tipps

Ein paar Dinge hier falsch;

  • Ihre inner2 werden muss der anruf i1 innerhalb einer Funktion
  • , da Sie nicht erklären inner1 statische braucht es eine Instanz der Ex7 umschließenden existieren.

So können Sie etwas tun können:

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

Um die i1 des Ex7 zugreifen zu können.

Wenn Sie Ihre Ex7 Instanz eine inner1 enthält und eine inner2 und Ihre Referenz aus inner2 ist inner2 -> parentEx7 -> Kind inner1.

Wenn Sie die innere Klasse machen statisch Sie mit dem Ex7 Referenz abschaffen können, wie Sie definieren, dass die innere Klasse nicht existiert eine Instanz der äußeren Klasse benötigen.

, aber es gibt keine Methode in Ex7Inner2 Klasse. create-Methode mit 'i1.bar ();' rufen innen und kompiliert es ok

Ex7Inner1 benötigt eine Referenz, um Ex7 zu instanziiert. Von Ex7Inner2 ist, dass Referenz Ex7.this.

So sagt

Ex7Inner1 i1 = Ex7.this.new Ex7Inner1()

Sehen Sie die Java Tutorial von mehr Informationen .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top