2012-03-13 101 views
0

我是新來的java,一直在撓頭理解它的一些概念。 我正在關注教程Java tutorial。但是,我找不到使用靜態嵌套類的有用性。我的意思是我想我需要一些很好的例子來說明我爲什麼要使用它。有人能提供一些代碼作爲例子,所以我可以更好地理解它嗎? thax什麼是Java中的靜態嵌套類?

+3

請參閱以下內容http://stackoverflow.com/questions/253492/static-nested-class-in-java-why – darijan 2012-03-13 16:35:19

回答

3

靜態嵌套類對「普通」類的好處是可以用它來反映兩個類之間的關係。

例如在JDK中有java.util.Mapjava.util.Map.Entry

​​被宣佈爲public static interface並且這樣做的方式清楚地表明其與Map的關係。它可以被定義爲java.util.MapEntry,但是將其作爲一個靜態嵌套接口來說明它與Map有很強的關係。

所以你可能只會使用靜態嵌套類,當嵌套類將永遠只能在其父上下文中使用。

+0

這肯定是編寫靜態嵌套類的合理方法,但靜態嵌套類不會不必知道它是什麼父母課程。你實際上可以編程一個名爲「Zoo」的外部類,並且有一個與「Zoo」類無關的「GalacticWarfare」靜態嵌套類。 – 2012-03-13 16:54:25

0

嵌套或內部類只是定義到其他類中的普通類。這樣做的原因通常是將內部類別隱藏起來,也就是說它還是另一種封裝類型。

內部類可以是私有的,受保護的和公共的,這意味着與字段和方法完全相同。

如果內部類不是私人的,您也可以從外部訪問它。它的名字是OuterClass.InnnerClass。嵌套深度不受Java規範的限制,所以內部類可以擁有自己的內部類等。

如果內部類不是靜態的,它還有另一個特性:調用外部類方法和字段的能力。

內部類也可以是匿名的。這對小回調,事件處理程序等非常有用。

希望這有助於。不要猶豫,去問其他更具體的問題。

1

以下示例可能不適用於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; 
    } 
} 
+0

注 - 靜態嵌套類無法訪問外部類的實例變量和非靜態方法。 – 2012-03-13 17:21:20

+0

如果嵌套靜態類創建外部類的對象,則它可以訪問示例中給出的外部類的所有私有成員。 – 2012-03-13 17:27:10

+0

對 - 我只是區分靜態嵌套類的內部類的本地能力。內部類實際上與外部類有關係,並且能夠直接訪問外部類成員。靜態嵌套類沒有。在你的例子中,你已經在靜態嵌套類中創建了一個外部類的實例。否則,靜態嵌套類實際上與外部類沒有任何隱式關係。 – 2012-03-13 17:38:17

0

我要補充的另一件事是,如果一個內部類是靜態的,它的一個實例將自動獲得它的父類實例的引用。你可以使用:NameOfOuterClass.this來引用它。

但如果它靜態,那麼它不會。

這是GC(垃圾收集)中的一個特色。 因爲如果內部類的對象沒有被GCed,那麼它引用的外部類對象也不會被GCed(在內部類不是靜態的情況下)。