6

内部クラスに内部クラスを作成しました:

public class EnclosingClass {

    public class InnerClass {
        private EnclosingClass getEnclosing() {
            return EnclosingClass.this;
        }

        public class InnerInnerClass {
            private InnerClass getEnclosing() {
                return InnerClass.this;
            }

            private EnclosingClass getEnclosingOfEnclosing() {
                return EnclosingClass.this;
            }
        }        
    }
}

Java が にInnerInnerClass直接アクセスできることに驚きましたEnclosingClass。このコードは Java によって内部的にどのように実装されていますか?

InnerInnerClass2 つのポインタ ( に 1 つと に 1 つ) を保持InnerClassするEnclosingClassか、InnerInnerClassは?EnclosingClassを介してアクセスします。InnerClass

4

4 に答える 4

11

結果のクラスをjavapで分解して、何が起こっているかを確認する必要があります。

private EnclosingClass getEnclosingOfEnclosing();
  Code:
     0: aload_0
     1: getfield      #1                  // Field this$1:LEnclosingClass$InnerClass;
     4: getfield      #3                  // Field EnclosingClass$InnerClass.this$0:LEnclosingClass;
     7: areturn

したがって、最初に直接囲んでいるクラスのインスタンスを取得し、次にそこから「トップレベル」の囲んでいるクラスを取得します。

于 2013-03-18T16:56:30.050 に答える
1

内部クラスが「静的」でない場合、それらは、それらが含まれているクラスへの内部参照を含みます。

于 2013-03-18T16:53:42.013 に答える
1

内部クラスを静的にしない限り、はい、その中に存在するインスタンスへの参照があり、メンバー(プライベートを含む)を参照できます。同じことが内部内部クラス、内部内部内部クラスなどにも当てはまります。

于 2013-03-18T16:54:07.377 に答える
0

publicとprivateはポインタの問題であり、コンパイラの問題です。

問題は、クラス/変数/メソッドのスコープを強制するコンパイラの1つです。プライベートメソッドgetEnclosing()はスコープに含まれるため、InnerClassそのクラス全体からアクセスできます。

ポインタはこの問題とは何の関係もないことに注意してください。リフレクション
を 使用すると、クラスのプライベートメンバーに引き続きアクセスできます。

于 2013-03-18T16:55:13.773 に答える