Java教程說,靜態內部類是通過使用封閉類的名稱,如新EnclosingClassNameHere.StaticNestedClassNameHere()訪問爲什麼我要在java中創建一個靜態類的實例?
我爲什麼要在所有創建靜態類的實例?有人可以解釋一下嗎?
Java教程說,靜態內部類是通過使用封閉類的名稱,如新EnclosingClassNameHere.StaticNestedClassNameHere()訪問爲什麼我要在java中創建一個靜態類的實例?
我爲什麼要在所有創建靜態類的實例?有人可以解釋一下嗎?
"static"
在這種情況下可能會產生誤導。它的真正含義是該類可以獨立存在。沒有包含類的實例,非靜態內部類不能存在。
IMO,當你開始在它所在的類之外使用一個內部類時,你需要考慮移動它並使它成爲它自己的頂級類。幾乎沒有什麼情況下,類之間的關係緊密結合,以至於需要將它作爲內部類。
在你的代碼示例:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
你正在創建StaticNestedClass的獨立實例。
如果它不是靜態的,你不能這樣做。您只能從OuterClass
的實例創建StaticNestedClass()
的實例。
如果你把它搬到自己的java文件,你可以把它幾乎相同:
StaticNestedClass notNestedAnymore = new StaticNestedClass();
至於你真正的問題:你爲什麼要創建它的一個實例?出於同樣的原因,你創建任何類的實例 - 它會做一些你需要的工作。
這段代碼沒有任何混淆。靜態嵌套類只是一種引入另一個名稱空間的方法。
通過創建一個靜態嵌套類,你表達了外層和內層類之間非常強大的關係。通常,嵌套類是助手或外部類的一部分。例如,當您創建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
作爲封閉實例。
在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
}
}
}
聲明一個內部類的靜態只是刪除這個隱式引用,這是靜態和非靜態內部類之間的唯一區別。
我明白這個部分。我的意思是我無法弄清楚爲什麼他們在他們的例子中創建一個** static **類的**實例**,它通常不需要C#中的實例:ClassName.memberName – 2011-12-18 20:24:58
@ user1104888因爲你'在這種情況下重新誤解詞「靜態」的本質。您正在考慮靜態類變量 - 除了這裏,類本身是靜態的,這與創建類的實例是正交的。 – 2011-12-18 20:28:38
@ user1104888:我更新了我的答案以解決您的問題。 – 2011-12-18 20:33:12