2014-08-30 189 views
1

我已經閱讀了關於靜態嵌套類和內部類之間差異的文章。我的問題更多的是一個習慣性的Java。在Java中創建靜態嵌套類的實例

我的要求是演示各種概念,如使用Java中的單一代碼進行繼承。一個單獨的類文件,以便它可以研究自上而下和在沙箱像ideone運行驗證 - http://ideone.com/jsHePB

class SOFieldAccessQuestion { 

    static class B { 
     int vf; 
     static int sf; 

     B(int i) { 
      vf = i; 
      sf = i + 1; 
     } 
    } 

    static class C extends B { 
     int vf; 
     static int sf; 
     C(int i) { 
      super(i+20); 
      vf = i; 
      sf = i + 2; 
     } 
    } 

    public static void main(String[] args) { 

     // Is it Okay to create an instance of static nested class? 

     C c1 = new C(100); 
     B b1 = c1; 

     System.out.println("B.sf = " + B.sf + ", b1.sf = " + b1.sf); 
     System.out.println("C.sf = " + C.sf + ", c1.sf = " + c1.sf); 

     System.out.println("b1.vf = " + b1.vf); 
     System.out.println("c1.vf = " + c1.vf); 
    } 

} 

我的問題是,是不是還好創建如上一個靜態嵌套類的實例?我擔心我在這裏忽略了「靜態」的含義。我應該如何引用和承認Java允許我創建靜態類對象的概念。

如果我沒有創建B或C的靜態類,那麼我不能在public static void main method內使用它們,並且可能不會用主入口點執行程序,因此我不得不這樣做。

回答

3

可以創建一個像上面這樣的靜態嵌套類的實例嗎?

是的。例如,查看java.util.Collections中的各種嵌套類。

我應該如何引用和確認Java允許我創建靜態類的對象的概念。

class一個內的static類稱爲嵌套類。包含的概念被稱爲member class,它(或多或少)像任何其他類的成員一樣。作爲static成員,嵌套類屬於包含類,而不屬於它的實例。

如果我沒有創建一個靜態B或C類的,那麼我就可以不使用它們 公共靜態無效的主要方法中,不得與主入口點執行程序 ,因此我被迫這樣做。

您仍然可以在您的SOFieldAccessQuestion之外聲明您的類,但是在同一個.java文件中。他們不能是public

+0

感謝您的回答。澄清我對這個概念的困惑。 – 2014-08-30 03:22:40

0

啊,我錯過了CTOR。這裏是正確的CTOR:

SOFieldAccessQuestion.B b = new SOFieldAccessQuestion.B(0); 
SOFieldAccessQuestion.C c = new SOFieldAccessQuestion.C(1); 
+0

謝謝。這是當我從SOFieldAccessQuestion以外的類中使用B和C時。我在SOFieldAccessQuestion主入口點內使用它們,因此只想將它們用作「B」和「C」。 – 2014-08-30 03:04:12

+0

這種事情很常見。例如,Map有一個類用於跟蹤鍵和值對,稱爲Entry。您將該類命名爲「Map.Entry」並創建該類。 – markspace 2014-08-30 03:05:56

0

是的,沒關係。

來自:http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

與類方法和變量,靜態嵌套類與它的外部類相關聯。像靜態類方法一樣,靜態嵌套類不能直接引用其封閉類中定義的實例變量或方法:它只能通過對象引用來使用它們。 注意:靜態嵌套類與其外部類(和其他類)的實例成員交互,就像任何其他頂級類一樣。實際上,爲了方便打包,靜態嵌套類在行爲上是嵌套在另一個頂級類中的頂級類。

OuterClass.StaticNestedClass 

例如,以創建靜態嵌套類的對象,使用此語法::

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

這是什麼

靜態嵌套類使用封閉類名稱訪問意思是class是在相對於包含類的static上下文中聲明的。如果你有一個類聲明如下:

class Container { 
    private int x; 
    public static class Inner { 
    private int y = x; // Invalid, member not in scope 
    } 
} 

這是行不通的,因爲靜態嵌套類不能訪問包含類的私有成員。

相關問題