1

ここに画像の説明を入力

気になるのは2点目です。

「this」ポインターが静的ではないため、内部クラスがアクセスできないという事実に関係している可能性があると思いました。それが正しい説明かどうかはわかりませんが。

これはまた、「「this」ポインターはどこで定義されているのか」という別の質問を提起しました。

4

2 に答える 2

2

内部クラスが であるstatic場合、外部クラスのインスタンスを囲むことなくインスタンス化できます。非static内部クラスの場合、インスタンス化には外部クラスのインスタンスが必要です。たとえば、クラス構造が次の場合:

public class A {
    public static class B {
    }

    public class C {
    }
}

次にインスタンス化するには、次のようにする必要がBあります。C

// simply
A.B b = new A.B();
// however
A.C c = new A().new C();

static内部クラスがインスタンス化されるとき、バックグラウンドで、外側のクラスのインスタンスがコンストラクターに渡されます。これにより、 のインスタンスにOuterClass.thisアクセスできるようになります。

「舞台裏」のことを確認するには、リフレクションを介して内部クラスの宣言されたコンストラクターと宣言されたフィールドを確認できます。

// prints that there is one field of type A called "this$1"
for (Field f : A.C.class.getDeclaredFields()) {
    System.out.println(f);
}

// prints that the constructor takes in one parameter of type A
for (Constructor c : A.C.class.getDeclaredConstructors()) {
    System.out.println(c);
}
于 2013-08-13T16:34:49.143 に答える