2016-05-21 12 views
-1

Wir wissen, dass Objekte innerer Klassen nur aus Objekten der umgebenden Klasse entstehen können. Warum also kann ein Objekt einer inneren Klasse eine nicht-statische Methode einer einschließenden Klasse außerhalb der Definition der einschließenden Klasse nicht aufrufen?Warum ist das Aufrufen einer Methode (nicht statisch) der äußeren Klasse mit einem Objekt einer inneren Klasse außerhalb der Definition der äußeren Klasse nicht erlaubt?

public class OuterClass 
{  
public class InnerClass 
    { 
     public void innerMethodA() 
     { 
      outerMethodA(); // This is OK. 
      new InnerClass().outerMethodA(); // This is not OK. 
     } 
    } 

    public void outerMethodA() 
    { 
     System.out.println("This is OuterMethodA"); 
    } 
} 

public class ExtraClass 
{ 
    public void testMethod() 
    { 
     OuterClass outerObj = new OuterClass(); 

     OuterClass.InnerClass innerObj = outerObj.new InnerClass(); 

     outerObj.outerMethodA(); // This is OK. 
     innerObj.outerMethodA(); // This is not. Why is that? 
    } 
} 

Bitte entschuldigen Sie etwaige Fehler in der Formatierung oder die Art, wie ich meine Frage vorlege. Ich habe es nach einigen Abstimmungen bearbeitet. Ich versuchte mein Bestes. Vielen Dank.

+1

Ich denke, das braucht Code. Ich bin mir nicht sicher, was du meinst. – markspace

+2

Sie benötigen eine Instanz einer beliebigen Klasse, um ihre nicht statischen Methoden aufzurufen. Innere Klassen haben diese Instanz nicht magisch, nur weil sie eingeschlossen ist –

+0

Warum möchten Sie so etwas tun? Was ist die treibende Kraft hinter dieser Frage? In welcher Situation würde das Sinn machen? –

Antwort

0

Bei dieser Stapelüberlauffrage ist es in der Praxis nicht möglich, eine umschließende Klasse aus einer inneren Klasse zu erhalten.

get the enclosing class object from anonymous inner class as function parameter

Die einzige Lösung, die ich sehe, ist eine Methode auf InnerClass zu schaffen, die für Sie den Anruf macht.

class OuterClass 
{ 

    public class InnerClass 
    { 
     public void innerMethodA() 
     { 
     outerMethodA(); // This is OK. 
     enclosingInstanceMethodA(); // This is OK now. 
     } 

     public void enclosingInstanceMethodA() 
     { 
     OuterClass.this.outerMethodA(); 
     } 
    } 

    public void outerMethodA() 
    { 
     System.out.println("This is OuterMethodA"); 
    } 
} 

class ExtraClass 
{ 

    public void testMethod() 
    { 
     OuterClass outerObj = new OuterClass(); 
     OuterClass.InnerClass innerObj = outerObj.new InnerClass(); 
     outerObj.outerMethodA(); // This is OK. 
     innerObj.enclosingInstanceMethodA(); // This is OK now. 
    } 
} 
Verwandte Themen