2011-12-18 76 views

回答

6

"static"在這種情況下可能會產生誤導。它的真正含義是該類可以獨立存在。沒有包含類的實例,非靜態內部類不能存在。

IMO,當你開始在它所在的類之外使用一個內部類時,你需要考慮移動它並使它成爲它自己的頂級類。幾乎沒有什麼情況下,類之間的關係緊密結合,以至於需要將它作爲內部類。

在你的代碼示例:

OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass(); 

你正在創建StaticNestedClass的獨立實例。

如果它不是靜態的,你不能這樣做。您只能從OuterClass的實例創建StaticNestedClass()的實例。

如果你把它搬到自己的java文件,你可以把它幾乎相同:

StaticNestedClass notNestedAnymore = new StaticNestedClass(); 

至於你真正的問題:你爲什麼要創建它的一個實例?出於同樣的原因,你創建任何類的實例 - 它會做一些你需要的工作。

5

這段代碼沒有任何混淆。靜態嵌套類只是一種引入另一個名稱空間的方法。

通過創建一個靜態嵌套類,你表達了外層和內層類之間非常強大的關係。通常,嵌套類是助手或外部類的一部分。例如,當您創建Tree類時,Node類是嵌套靜態類的一個好候選。 Tree.Node清楚地解釋了Node類的目的。

實際上,static關鍵字的用法與static字段一致。在這兩種情況下,您都可以訪問static實體,而無需包含類的實例。當涉及到static類時,它的基本含義是:「我可以創建此靜態嵌套類的實例,而不需要外部類的實例」。默認情況下(當不使用關鍵字static時)嵌套類變爲內部類。在這種情況下,你不能簡單地寫:

new OuterClass.StaticNestedClass(); 

相反,你需要通過OuterClass例如帶着幾分晦澀的語法:

OuterClass outerClassInstance = new OuterClass(); 
outerClassInstance.new InnerClass(); 

幸運時new InnerClass()執行OuterClass體,隱含地使用this作爲封閉實例。

+0

我明白這個部分。我的意思是我無法弄清楚爲什麼他們在他們的例子中創建一個** static **類的**實例**,它通常不需要C#中的實例:ClassName.memberName – 2011-12-18 20:24:58

+0

@ user1104888因爲你'在這種情況下重新誤解詞「靜態」的本質。您正在考慮靜態類變量 - 除了這裏,類本身是靜態的,這與創建類的實例是正交的。 – 2011-12-18 20:28:38

+0

@ user1104888:我更新了我的答案以解決您的問題。 – 2011-12-18 20:33:12

1

在java中,內部類對外部類的實例有一個隱式引用。通過這種方式,您可以直接訪問外部類的成員,這在用於回調的匿名類中非常有用。

class A{ 
    private int a = 3; 
    class Inner{ 
     Inner(){ 

     System.out.println(a);//also A.this.a 
     } 
    } 
    static class StaticInner{ 
     StaticInner(){ 
      System.out.println(a);//FAILS 
     } 

    } 
} 

聲明一個內部類的靜態只是刪除這個隱式引用,這是靜態和非靜態內部類之間的唯一區別。

相關問題