2016-05-21 26 views
-1

我們知道內部類的對象只能從封閉類的對象中產生。那麼爲什麼內部類的對象不能在封閉類的定義之外調用封閉類的非靜態方法呢?爲什麼在外部類的定義之外不允許使用內部類的對象調用外部類的方法(非靜態)?

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? 
    } 
} 

請原諒格式錯誤或我提出我的問題的方式。我在一些倒票後編輯它。我已經盡力了。謝謝。

+1

我認爲這需要代碼。我不確定你的意思。 – markspace

+2

您需要任何類的實例來調用它的非靜態方法。內部類不會奇蹟般地擁有該實例,只是因爲它包含在內 –

+0

爲什麼你想要這樣做?這個問題背後的推動力是什麼?這在什麼情況下才有意義? –

回答

0

根據這個堆棧溢出問題,從內部類中獲取封閉類是不可能的(在實踐中)。

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

我看到的唯一的解決辦法是提供InnerClass的方法,它使得你的電話。

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. 
    } 
} 
相關問題