2017-07-28 2 views
3

Unten ist das Programm, das erfolgreich kompiliert, aber wie greife ich auf m2() -Methode der Klasse B innerhalb der Methode m1() der Klasse A.Wie kann ich auf eine Methode zugreifen, die innerhalb einer Klasse innerhalb einer anderen Methode einer anderen Klasse in Java ist

class A{ 
    public void m1() 
    { 
     System.out.println("A-m1"); 
     class B{ 
      public void m2() 
      { 
       System.out.println("B-m2"); 
      } 
     }//end of class B 
    }//end of m1() method 
}// end of class A 
+0

wo möchten Sie darauf zugreifen? –

+0

Am Ende, eine nette Frage. Ich habe es im Vorfeld total falsch verstanden - da ich selbst von * lokalen * Klassen nicht wusste - obwohl sie mit java8 hinzugefügt wurden. Also, meine Stimme für eine Frage, die mir heute etwas zu lernen gab. Und Entschuldigung für die Zigionen von Updates, die ich zu meiner Antwort machen musste. – GhostCat

Antwort

3

Es hängt alles vom Umfang ab. Wenn Sie m2() am Ende von m1() aufrufen möchten, ist es so einfach wie das Erstellen einer neuen Instanz von B und das Aufrufen der Methode.

Wenn Sie es außerhalb der Methode oder vor der Deklaration aufrufen möchten, wird es Sie aufgrund des Umfangs nicht zulassen.

Wenn das der Fall ist, sollten Sie in Betracht ziehen, seinen Bereich auf Klassenebene zu fördern.

2

Einfach: Sie können nicht außerhalb der Klasse (na ja, nicht in einer vernünftigen Art und Weise).

B ist eine local Klasse - sie existiert nur im Rahmen dieser Methode m1(). Daher können Sie nur innerhalb dieser Methode instanziieren. Also, innerhalb m1(), können Sie eine einfache B b = new B() machen und dann b.m2() aufrufen. Aber außerhalb dieser Methode gibt es keine Syntax, die Ihnen erlauben würde, zu A.m1().B.m2() zu gelangen.

Nun, Sie können es auch außerhalb dieser Methode unter Verwendung der Reflexion instanziieren. Sie sehen, der verstümmelte Name der Klasse ist A $ 1B.class.

Daher könnten Sie Class.forName("A$1B") verwenden, um die entsprechende Klasse zu erhalten; Wenn Sie dann eine Instanz der Klasse A haben, können Sie die Reflektion erneut verwenden, um ein Objekt dieser lokalen Klasse zu instanziieren. Und an dieser Stelle könnten Sie dann m2() aufrufen - wiederum mit Reflektion.

Aber: Sie sollten nicht einmal versuchen, das zu tun. Wenn diese Klasse B und ihre Methode m2() von anderen Stellen aufgerufen werden müssen, dann machen Sie es einfach nicht zu einer lokalen Klasse. Machen Sie es zu einer inneren Klasse oder sogar zu einer (vielleicht nicht öffentlichen) Top-Level-Klasse.

Verwandte Themen