我是新來的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. C++中是否存在類似Java的靜態嵌套類?
- 3. 嵌套靜態類
- 4. 靜態嵌套類的安全性JAVA
- 5. Java:靜態嵌套類和反射:「$」vs「。」
- 6. Java:非靜態嵌套類和instance.super()
- 7. 爲什麼java.lang.Thread實現中的靜態嵌套類不可見?
- 8. 爲什麼Java中的LinkedList實現將Node嵌套類視爲靜態?
- 9. 嵌套靜態類C#
- 10. GetValue嵌套類中的靜態字段
- 11. Java:什麼是靜態{}?
- 12. 什麼是嵌套類型?
- 13. Java:如何從靜態嵌套類引用外部類的非靜態字段?
- 14. 爲什麼Java中沒有靜態類
- 15. 在Java中創建靜態嵌套類的實例
- 16. 在Java中訪問靜態嵌套類的方法
- 17. 嵌套的靜態類名稱以$
- 18. Groovy的導入靜態嵌套類
- 19. 嵌套本地類的靜態方法
- 20. 匿名和靜態嵌套類的NoClassDefFoundError
- 21. 嵌套類的接口靜態方法
- 22. 非靜態類中靜態方法的要點是什麼?
- 23. JAVA:什麼時候該類應該是靜態或動態的
- 24. 在RPython中靜態類型是什麼?
- 25. 什麼是java中的類靜態變量
- 26. 嵌套類的原因是什麼
- 27. 何時通過非靜態嵌套類聲明嵌套靜態類是個好主意?
- 28. 嵌套的靜態類無法返回其靜態字段
- 29. 嵌套類在Java和引用它們的靜態主
- 30. 一組用於嵌套靜態類
請參閱以下內容http://stackoverflow.com/questions/253492/static-nested-class-in-java-why – darijan 2012-03-13 16:35:19