2012-09-08 83 views
0

我有這樣的代碼我需要訪問NestedClass內的getInnerS()方法中的靜態類InnerClass的變量mysample。我試圖通過創建一個新對象InnerClass來訪問它,但我得到java.lang.StackOverflowError使用外部類訪問靜態類成員

public class NestedClass{ 
    private String outer = "Outer Class"; //NestedClass instance variable 
    NestedClass.InnerClass innerClass = new NestedClass.InnerClass(); 

    void getOuterS(){ 
     System.out.println(outer); 
    } 
    void getInnerS(){ 
     System.out.println(innerClass.mysample); 
    } 
    static class InnerClass{ 
     private String mysample = "Inner Class"; //InnerClass instance variable, 
     NestedClass a = new NestedClass(); 
     void getIn(){ 
      System.out.println(mysample); 
     } 
     void getOut(){ 
      System.out.println(a.outer); 
     } 
    } 
    public static void main(String[] args){ 
     NestedClass nestedClass = new NestedClass(); 
     NestedClass.InnerClass nestedInner = new NestedClass.InnerClass(); 
     nestedClass.getOuterS(); 
     nestedClass.getInnerS(); 
     nestedInner.getIn(); 
     nestedInner.getOut(); 
    } 
} 

回答

1
NestedClass a = new NestedClass(); 
靜態將InnerClass類

創建NestedClass的實例,併爲將InnerClass是靜態的,這是一個循環。

將InnerClass不需要是靜態的,這應該工作

public class NestedClass { 
private String outer = "Outer Class"; //NestedClass instance variable 
NestedClass.InnerClass innerClass = new NestedClass.InnerClass(); 

void getOuterS(){ 
    System.out.println(outer); 
} 
void getInnerS(){ 
    System.out.println(innerClass.mysample); 
} 
class InnerClass{ 
    private String mysample = "Inner Class"; //InnerClass instance variable, 
    NestedClass a = NestedClass.this; 
    void getIn(){ 
     System.out.println(mysample); 
    } 
    void getOut(){ 
     System.out.println(a.outer); 
    } 
} 
public static void main(String[] args){ 
    NestedClass nestedClass = new NestedClass(); 
    NestedClass.InnerClass nestedInner = nestedClass.innerClass; 
    nestedClass.getOuterS(); 
    nestedClass.getInnerS(); 
    nestedInner.getIn(); 
    nestedInner.getOut(); 
} 


} 
+0

非常感謝你..... Nahuel Fouilleul我gotit ..如果你不介意你能說,我們爲什麼使用這個..? –

+0

+1用於刪除靜態,允許使用'NestedClass.this'用於 – Reimeus

+0

如果InnerClass是靜態的,它不能訪問非靜態的外部類的成員,但如果不存在至少一個可以被接受的外部類的實例,創建嵌套實例的那個。對不起,如果不清楚也許別人可以更好地解釋 –

3

InnerClass構造:

NestedClass a = new NestedClass(); 

因此,創建一個新的NestedClass,這將創建一個新的InnerClass,創造本身自己的NestedClass,與相應的InnerClass ....難怪堆棧溢出。

如果你想訪問封閉類時,應使用(內InnerClass方法)

NestedClass.this 
+0

我改變並刪除了NestedClass a = new NestedClass();並改爲System.out.println(NestedClass.this.outer);在內部類,但我越來越編譯錯誤說:「沒有NestedClass類型的封閉實例可以在範圍內訪問」 –

+0

非常感謝SJuan76瞭解它:) :) –

0

有了這個解決方案成員類是static。爲了更好的比較,你可能會讀 Static class declarations

靜態內部類(介紹)

靜態嵌套類不具有訪問非靜態字段和外部類的方法,這些方法類似於一些方法在類中定義的靜態方法。只能通過外部類的實例引用來訪問非靜態字段和方法。在這方面,靜態嵌套類與任何其他頂級類非常相似。

此外,靜態嵌套類可以訪問外部類的任何靜態方法,包括私有。

這些類的好處主要在於實體的邏輯分組,以改善封裝以及節省類空間。

public class NestedClass{ 
    private static String outer = "Outer Class"; //NestedClass instance variable 
    InnerClass innerClass = new InnerClass(); 

    void getOuterS(){ 
    System.out.println(outer); 
    } 
    void getInnerS(){ 
    System.out.println(InnerClass.mysample); 
    } 
    InnerClass getInner(){ 
    return innerClass; 
    } 
    static class InnerClass{ 
    private static String mysample = "Inner Class"; //InnerClass instance variable, 
    void getIn(){ 
     System.out.println(mysample); 
    } 
    void getOut(){ 
     System.out.println(outer); //access a static member 
    } 
    } 
    public static void main(String[] args){ 
    NestedClass nestedClass = new NestedClass(); 
    NestedClass.InnerClass nestedInner = nestedClass.getInner(); 
    nestedClass.getOuterS(); 
    nestedClass.getInnerS(); 
    nestedInner.getIn(); 
    nestedInner.getOut(); 
    } 
}