2015-09-05 24 views
6

有沒有什麼方法可以訪問Java中的本地內部類的方法。以下代碼是我之前嘗試過的示例代碼。據此,訪問mInner()方法的機制是什麼?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

有什麼錯誤,你獲取 –

+1

您無法訪問您在方法中定義的類。在方法外定義它,您將能夠訪問它。 –

+0

線程「main」中的異常java.lang.Error:未解決的編譯問題:方法mInner()未定義類型Object –

回答

5

正如ILikeTau的評論所說,您無法訪問您在方法中定義的類。你可以在方法外定義它,但另一種可能是定義一個interface(或抽象類)。然後,代碼仍然在您的方法中,並且可以訪問方法中定義的變量和參數(如果您將整個課程移到外面,則不能這樣做)。喜歡的東西:

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

注:沒有測試

注意,返回類型,以及ob類型,已經從Object改變。這是因爲在Java中,如果您聲明某個內容爲Object,則只能訪問爲Object定義的方法。編譯器必須在編譯時(不是在運行時)知道您的對象ob有一個mInner方法,並且它不能說明它是否唯一知道的是它是Object。通過將其更改爲AnInterface,編譯器現在知道它有一個mInner()方法。

+0

它爲我工作謝謝。 –

0

一個局部類的範圍規則是幾乎相同的作爲變量的範圍規則,也就是說,它被限制在封閉塊。

如果您不能從main訪問變量iob,您不能從main訪問本地類Inner

在封閉塊之外,本地類和匿名類之間沒有區別。都不能訪問。不同的是,內的封閉塊中,本地類可以通過名稱訪問,如果需要反覆訪問它,則尤其有用。創建多個實例。

與封閉塊外部的本地/匿名類進行交互的唯一方法是通過所討論的類實現的任何超類或接口。

-1

要訪問的內部類創建內部類的對象..

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

從你的例子

outer t=new outer(); 

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

希望這有助於你...

+0

對不起,但不會爲這種情況下工作 – Jerry

+0

@JavaLearner您的答案是適合訪問正規的內部類。它不適用於當地的內部班級。 –