我是新來的java,一直在撓頭理解它的一些概念。 我正在關注教程Java tutorial。但是,我找不到使用靜態嵌套類的有用性。我的意思是我想我需要一些很好的例子來說明我爲什麼要使用它。有人能提供一些代碼作爲例子,所以我可以更好地理解它嗎? thax什麼是Java中的靜態嵌套類?
回答
靜態嵌套類對「普通」類的好處是可以用它來反映兩個類之間的關係。
例如在JDK中有java.util.Map
和java.util.Map.Entry
。
被宣佈爲public static interface
並且這樣做的方式清楚地表明其與Map
的關係。它可以被定義爲java.util.MapEntry
,但是將其作爲一個靜態嵌套接口來說明它與Map
有很強的關係。
所以你可能只會使用靜態嵌套類,當嵌套類將永遠只能在其父上下文中使用。
這肯定是編寫靜態嵌套類的合理方法,但靜態嵌套類不會不必知道它是什麼父母課程。你實際上可以編程一個名爲「Zoo」的外部類,並且有一個與「Zoo」類無關的「GalacticWarfare」靜態嵌套類。 – 2012-03-13 16:54:25
嵌套或內部類只是定義到其他類中的普通類。這樣做的原因通常是將內部類別隱藏起來,也就是說它還是另一種封裝類型。
內部類可以是私有的,受保護的和公共的,這意味着與字段和方法完全相同。
如果內部類不是私人的,您也可以從外部訪問它。它的名字是OuterClass.InnnerClass
。嵌套深度不受Java規範的限制,所以內部類可以擁有自己的內部類等。
如果內部類不是靜態的,它還有另一個特性:調用外部類方法和字段的能力。
內部類也可以是匿名的。這對小回調,事件處理程序等非常有用。
希望這有助於。不要猶豫,去問其他更具體的問題。
以下示例可能不適用於Java初學者,但靜態嵌套類的一個很好的示例是當您想使用Builder pattern構造外部類的不可變對象時。允許靜態嵌套類訪問外部類的私有成員,從而構造外部類的對象,雖然它具有私有構造函數並初始化外部類的私有字段。 例如
public class SomeClass {
private int someField;
private int someOtherField;
private SomeClass()
{}
public static class SomeBuilder {
private int someField;
private int someOtherField;
public SomeBuilder setSomeField(int someField)
{
this.someField = someField;
return this;
}
public SomeBuilder setSomeOtherField(int someOtherField) {
this.someOtherField = someOtherField;
return this;
}
public SomeClass build() throws ValidationException
{
validateFields();
SomeClass someClass = new SomeClass();
someClass.someField = someField;
someClass.someOtherField = someOtherField;
return someClass;
}
private void validateFields() throws ValidationException {
//Validate fields
}
}
public int getSomeField() {
return someField;
}
public int getSomeOtherField() {
return someOtherField;
}
}
注 - 靜態嵌套類無法訪問外部類的實例變量和非靜態方法。 – 2012-03-13 17:21:20
如果嵌套靜態類創建外部類的對象,則它可以訪問示例中給出的外部類的所有私有成員。 – 2012-03-13 17:27:10
對 - 我只是區分靜態嵌套類的內部類的本地能力。內部類實際上與外部類有關係,並且能夠直接訪問外部類成員。靜態嵌套類沒有。在你的例子中,你已經在靜態嵌套類中創建了一個外部類的實例。否則,靜態嵌套類實際上與外部類沒有任何隱式關係。 – 2012-03-13 17:38:17
我要補充的另一件事是,如果一個內部類是不靜態的,它的一個實例將自動獲得它的父類實例的引用。你可以使用:NameOfOuterClass.this
來引用它。
但如果它是靜態,那麼它不會。
這是GC(垃圾收集)中的一個特色。 因爲如果內部類的對象沒有被GCed,那麼它引用的外部類對象也不會被GCed(在內部類不是靜態的情況下)。
- 1. 爲什麼靜態嵌套類?
- 2. Java靜態嵌套類VS頂層類
- 3. C++中是否存在類似Java的靜態嵌套類?
- 4. 嵌套靜態類
- 5. 靜態嵌套類
- 6. 靜態嵌套類的安全性JAVA
- 7. 實現AsyncTask的正確方法是什麼?靜態或非靜態嵌套類?
- 8. 靜態嵌套類中的方法是隱式靜態的嗎?
- 9. Java:非靜態嵌套類和instance.super()
- 10. Java:靜態嵌套類和反射:「$」vs「。」
- 11. 爲什麼java.lang.Thread實現中的靜態嵌套類不可見?
- 12. 爲什麼Java中的LinkedList實現將Node嵌套類視爲靜態?
- 13. 我們是否可以從靜態嵌套類訪問非靜態嵌套類的非靜態方法
- 14. 靜態嵌套類型
- 15. 嵌套靜態類C#
- 16. Java:什麼是靜態{}?
- 17. 什麼是嵌套類
- 18. 什麼是嵌套類型?
- 19. GetValue嵌套類中的靜態字段
- 20. 什麼是java中的靜態接口?
- 21. 爲什麼Java中沒有靜態類
- 22. Java:如何從靜態嵌套類引用外部類的非靜態字段?
- 23. 如何使用從Java中的嵌套接口繼承的靜態方法定義嵌套靜態類?
- 24. 爲什麼HashMap中的Entry類在java中是靜態的
- 25. Java中嵌套類的目的是什麼?
- 26. 在Java中創建靜態嵌套類的實例
- 27. 在Java中訪問靜態嵌套類的方法
- 28. 嵌套類VS靜態內部類
- 29. 嵌套本地類的靜態方法
- 30. 嵌套類的接口靜態方法
請參閱以下內容http://stackoverflow.com/questions/253492/static-nested-class-in-java-why – darijan 2012-03-13 16:35:19