2015-09-05 10 views
6

Gibt es eine Möglichkeit, auf die Methoden lokaler innerer Klassen in Java zuzugreifen. Der folgende Code ist der Beispielcode, den ich zuvor ausprobiert habe. Was ist demnach der Mechanismus, um auf die mInner() Methode zuzugreifen?Zugriffsmethoden innerhalb lokaler innerer Klassen in Java

class Outer{ 
    int a=100; 

    Object mOuter(){ 
     class Inner{ 
      void mInner(){ 
       int y=200; 
       System.out.println("mInner.."); 
       System.out.println("y : "+y); 
      } 
     } 
     Inner iob=new Inner(); 
     return iob; 
    } 
} 
class Demo{ 
    public static void main(String args[]){ 
     Outer t=new Outer(); 
     Object ob=t.mOuter(); 
     ob.mInner(); // ?need a solution.. 
    } 
} 
+0

was ist der Fehler, den Sie get –

+1

Sie können nicht auf eine Klasse zugreifen, die Sie in einer Methode definieren. Definieren Sie es außerhalb der Methode und Sie können darauf zugreifen. –

+0

Ausnahme im Thread "main" java.lang.Error: Ungelöstes Kompilierungsproblem: Die Methode mInner() ist für den Typ Objekt nicht definiert. –

Antwort

5

Wie ILikeTaus Kommentar sagt, können Sie nicht auf eine Klasse zugreifen, die Sie in einer Methode definieren. Sie können es außerhalb der Methode definieren, aber eine andere Möglichkeit besteht darin, eine interface (oder abstrakte Klasse) zu definieren. Dann wäre der Code immer noch innerhalb Ihrer Methode und könnte auf final Variablen und Parameter zugreifen, die in der Methode definiert sind (was Sie nicht tun konnten, wenn Sie die gesamte Klasse nach draußen verschoben haben). Etwas wie:

class Outer { 
    int a = 100; 

    public interface AnInterface { 
     void mInner(); // automatically "public" 
    } 

    AnInterface mOuter() { // note that the return type is no longer Object 
     class Inner implements AnInterface { 
      @Override 
      public void mInner() { // must be public 
       int y = 200; 
       System.out.println("mInner.."); 
       System.out.println("y : " + y); 
      } 
     } 
     Inner iob = new Inner(); 
     return iob; 
    } 
} 

class Demo { 
    public static void main(String[] args) { // the preferred syntax 
     Outer t = new Outer(); 
     Outer.AnInterface ob = t.mOuter(); 
     ob.mInner(); 
    } 
} 

Hinweis: nicht

Beachten Sie, dass der Rückgabetyp und die Art der ob, geändert wurden von Object getestet. Wenn Sie in Java ein Objekt als Object deklarieren, können Sie nur auf die für Object definierten Methoden zugreifen. Der Compiler muss zur Kompilierungszeit (nicht zur Laufzeit) wissen, dass Ihr Objekt ob über eine mInner-Methode verfügt, und es kann nicht sagen, ob das einzige, was es weiß, dass es ein Object ist. Durch die Änderung in AnInterface weiß der Compiler jetzt, dass es eine mInner()-Methode hat.

+0

Es funktioniert für mich Danke. –

0

Die Scoping-Regeln einer lokalen Klasse sind so ziemlich die gleichen wie die Scoping-Regeln einer Variablen, das heißt, es auf den umschließenden Block beschränkt.

auf die gleiche Weise nicht variabel iob von main zugreifen können, können Sie nicht lokale Klasse Inner von main zugreifen.

Außerhalb des umschließenden Blocks gibt es keinen Unterschied zwischen einer lokalen Klasse und einer anonymen Klasse. Auf beide kann nicht zugegriffen werden. Der Unterschied ist, dass innerhalb von der umschließende Block, die lokale Klasse kann namentlich zugegriffen werden, besonders nützlich, wenn Sie wiederholt darauf zugreifen müssen, z. um mehrere Instanzen zu erstellen.

Die einzige Möglichkeit, mit einer lokalen/anonymen Klasse außerhalb des umschließenden Blocks zu interagieren, ist über eine Superklasse oder Schnittstelle, die von der betreffenden Klasse implementiert wird.

-1

Um die innere Klasse Zugriff auf ein Objekt der inneren Klasse erstellen ..

OuterClass.InnerClass innerObject = outerObject.new InnerClass(); 

aus Ihrem Beispiel

outer t=new outer(); 

outer.inner inner1=t.new inner(); 

Hope this Sie hilft ...

+0

Tut mir leid, aber das funktioniert nicht für diesen Fall – Jerry

+0

@JavaLearner Ihre Antwort ist für den Zugriff auf reguläre innere Klassen geeignet. Es ist nicht anwendbar für lokale innere Klassen. –