簡體   English   中英

靜態嵌套類可以訪問封閉類的哪些成員?

[英]What members of the enclosing class can a static nested class access?

  1. Java The Complete Reference 說

    靜態嵌套類是應用了靜態修飾符的類。 因為它是靜態的,所以它必須通過一個對象訪問其封閉類的非靜態成員 也就是說,它不能直接引用其封閉類的非靜態成員 由於這個限制,很少使用靜態嵌套類。

    “通過一個對象”和“不能……直接”是什么意思?

  2. 簡而言之,Java 說

    • 靜態成員類型可以(僅)訪問包含它的類的靜態成員

    • 靜態成員類型可以訪問其包含類型的所有靜態成員(包括任何其他靜態成員類型)。

    兩個句子是否相互冗余? 這兩個句子有什么區別?

  3. 這兩本書的引文是否相互矛盾? 第一個引號表示靜態嵌套類可以訪問封閉類的非靜態成員,而第二個引號表示靜態成員類型只能訪問封閉類的靜態成員。

謝謝。

在 Java 中嵌套的非靜態類具有對父類實例的隱藏引用。 這就是為什么他們可以訪問所有非靜態成員。 嵌套類沒有這樣的實例。 但是,如果父類通過this ,它的作用域允許它訪問父成員。

所以第二個引用是說訪問不會自動發生。 您將引用傳遞給封閉類,嵌套的靜態類可以訪問它。 否則,它不知道封閉類的地址。

沒有首先使用包含類的對象對其進行限定的靜態方法不能直接訪問實例字段。

class Foo {
   int myField;

   public void main(String[] args) {
       Foo foo = new Foo();
       access(foo);
   }
   public static void access(Foo obj) {
      System.out.println(myField); // <-- error, can't access myField from static 
                                   //context.
      System.out.println(obj.myField); // OK here  
   }
}

通過內部靜態類訪問實例字段也是如此。

java靜態嵌套類可以訪問嵌套類的靜態成員和父類的靜態成員。 當您了解類和對象在內存中的位置時,這是有道理的——只有一個類,但有多個對象,您需要確定對象的每個實例絕對需要什么,什么實際上是冗余的並且可以留在類中(不需要重復),所以所有方法(靜態和非靜態)和所有靜態成員

靜態嵌套類可以訪問封閉類的哪些成員?

通過為 Java 關鍵字static分配以下含義,您可以清楚地回答這個問題:

Java 中的“靜態”意味着不考慮或與任何類的任何實例無關

  • 靜態字段屬於聲明它的類,並且沒有被該類的任何實例封裝。 隨后構造的類的任何實例(或作用域內的任何類的任何實例或任何方法)都可以訪問靜態字段(這就是靜態字段在並發環境中可能是危險的原因)。

  • 靜態方法是為聲明它的類定義的,並且沒有該類的關聯實例。 靜態方法不知道沒有類實例並且不能訪問它們中的任何一個,除非對實例的引用作為參數傳遞給它。

  • 靜態成員類在所有方面都與普通頂級類相同,后者已被打包在封閉類中以方便打包。 就像頂級類一樣,它的實例對封閉類的任何實例一無所知(除非在構造過程中向它們傳遞了對封閉類實例的引用)。

  • 靜態初始化塊用於初始化類的靜態字段,但它不知道該類的任何實例。 因此,它們無法初始化實例字段,因為它們無法訪問它們。

因此,答案變得直觀:靜態嵌套類可以訪問封閉類的所有成員,這些成員無需該類的實例即可訪問。

如果將封閉類實例傳遞給靜態嵌套類的構造函數,則該實例的成員(包括私有成員)將在范圍內。 從邏輯上講,將封閉類實例傳遞給靜態嵌套類構造函數與使用嵌套成員類非常相似。 區別在於前者,關聯是顯式的依賴注入; 而對於后者,實例之間的關聯是隱含的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM