簡體   English   中英

外部類可以訪問內部類的成員嗎?

[英]Can an outer class access the members of inner class?

內部類是在類中定義的類,內部類可以聲明為public,private,protected。 如果內部類定義為private和protected,外層類可以訪問內部類的成員嗎? 並且內部類可以訪問外部類的成員嗎?

通常,您可以(訪問內部類的私有字段,反之亦然)。 以下代碼在Eclipse下編譯:

public class Outer {

  private int x;

  public void f() {
    Inner inner = new Inner();
    inner.g();
    inner.y = 5;
  }

  private class Inner {
    private int y;

    public void g() { x = 5; }
  }    
}

也就是說,您可以配置IDE /編譯器來處理對錯誤等字段的訪問(在Eclipse中,此設置稱為“訪問封閉類型的不可訪問成員”,在Preferences - > Java - > Compiler - > Error /下)警告 - >代碼風格)

如果內部類定義為private和protected,外層類可以訪問內部類的成員嗎?

是。 這些限定符只會影響從外部類派生的類中內部類的可見性。

內部類可以訪問外部類的成員嗎?

是的,包括那些聲明為private ,就像任何實例方法一樣。

是! 您可以從外部類訪問內部類成員,反之亦然(與訪問修飾符無關)。 但是,對於靜態嵌套類,您無法僅通過字段名稱訪問其字段,並且需要像訪問它一樣訪問它

InnerClass.staticInnerField 

雖然您可以直接通過字段名稱從內部類訪問外部類的靜態字段。

解釋是在常規內部類的上下文中[常規內部類不能在其中聲明靜態成員]

您可以直接從內部類訪問外部類的任何字段。

class Outer {
  private static int x = 0;

  class Inner {
    void print() {
      System.out.println(x); // x can be directly accessed
    } 
  }

  public static void main(String[] args) {
    new Outer().new Inner().print();
  }
}

甚至Outer類也可以通過內部類的對象訪問Inner類的任何字段。

class Outer {
  private class Inner {
    private int x = 10;
  }

  void print() {
    Inner inner = new Inner();
    System.out.println(inner.x);
  }

  public static void main(String[] args) {
    Outer outer = new Outer();
    outer.print();
  }
}

“嵌套類是在另一個類中定義的類。嵌套類應該只存在於它的封閉類中。如果嵌套類在某些其他上下文中很有用,那么它應該是一個頂級類。有四種類嵌套類:靜態成員類,非靜態成員類,匿名類和本地類。除了第一類之外,所有類都被稱為內部類。“

(Joshua Bloch,來自Effective Java的書。)

至於你的問題:你很容易自己測試。 但答案是肯定的(即使對於private成員),只要您不是試圖從靜態上下文訪問非靜態成員(而不是從引用),或嘗試訪問不可訪問范圍內的成員。

也就是說,非常像人們期望的那樣=)。

暫無
暫無

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

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