web-dev-qa-db-ja.com

外部クラスは内部クラスのメンバーにアクセスできますか?

内部クラスはクラス内で定義されたクラスであり、内部クラスはpublic、private、protectedとして宣言できます。内部クラスがprivateおよびprotectedとして定義されている場合、外部クラスは内部クラスのメンバーにアクセスできますか?内部クラスは外部クラスのメンバーにアクセスできますか?

12
user707549

内部クラスがprivateおよびprotectedとして定義されている場合、外部クラスは内部クラスのメンバーにアクセスできますか?

はい。これらの修飾子は、外部クラスから派生したクラスの内部クラスの可視性にのみ影響します。

内部クラスは外部クラスのメンバーにアクセスできますか?

はい、他のインスタンスメソッドと同じように、privateと宣言されたものも含みます。

20
AbdullahC

一般に、次のことができます(内部クラスのプライベートフィールドにアクセスする、またはその逆)。次のコードは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では、この設定は「設定-> Java->コンパイラー」で「囲んでいるタイプのアクセスできないメンバーへのアクセス」と呼ばれます->エラー/警告->コードスタイル)

24
Itay Maman

はい!外部クラスから内部クラスメンバーにアクセスすることも、その逆も可能です(アクセス修飾子に関係なく)。ただし、静的にネストされたクラスの場合、フィールド名だけでそのフィールドにアクセスすることはできず、次のようにアクセスする必要があります。

InnerClass.staticInnerField 

ただし、フィールド名を使用して、内部クラスから外部クラスの静的フィールドに直接アクセスできます。

2
probalm

「ネストされたクラスは、別のクラス内で定義されたクラスです。ネストされたクラスは、それを囲むクラスを提供するためにのみ存在する必要があります。ネストされたクラスが他のコンテキストで役立つ場合は、トップレベルのクラスである必要があります。4種類あります。ネストされたクラスの例:静的メンバークラス、非静的メンバークラス、匿名クラス、ローカルクラス。第1種を除くすべては、内部クラスと呼ばれます。」

(Joshua Bloch、本Effective Javaから。)

質問について:自分でテストするのはとても簡単です。ただし、静的コンテキストから(参照以外から)非静的メンバーにアクセスしようとしない限り、または静的コンテキストから非静的メンバーにアクセスしようとしない限り、答えは「はい」です(privateメンバーの場合でも)。アクセスできないスコープ内にあります。

つまり、予想どおり=)です。

2
Datoraki

説明は通常の内部クラスのコンテキストにあります[通常の内部クラスは静的メンバーを内部で宣言することはできません]

内部クラスから外部クラスの任意のフィールドにアクセスできます直接

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();
  }
}

外部クラスでさえ、内部クラスの任意のフィールドにアクセスできますが、内部クラスのオブジェクトを介してアクセスできます。

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();
  }
}
1
Varun