정적 중첩 클래스가 외부 클래스의 "this"포인터에 액세스 할 수없는 이유는 무엇입니까?
저를 귀찮게하는 것은 두 번째 요점입니다.
"this"포인터가 정적이 아니므로 내부 클래스가 액세스 할 수 없다는 사실과 관련이 있다고 생각했습니다. 비록 그게 올바른 설명인지 모르겠다.
또 다른 질문이 제기되었습니다. "이"포인터는 어디에 정의되어 있습니까? "
정적 중첩 클래스가 외부 클래스의 "this"포인터에 액세스 할 수없는 이유는 무엇입니까?
저를 귀찮게하는 것은 두 번째 요점입니다.
"this"포인터가 정적이 아니므로 내부 클래스가 액세스 할 수 없다는 사실과 관련이 있다고 생각했습니다. 비록 그게 올바른 설명인지 모르겠다.
또 다른 질문이 제기되었습니다. "이"포인터는 어디에 정의되어 있습니까? "
static
가 아닌 static
중첩 클래스 한 차이는 static
내부 클래스는 아니지만 비 static
내부 클래스의 인스턴스가 클로징 클래스의 특정 인스턴스와 연관된 정확하게이다. 여기서 static
내부 클래스의 인스턴스에 대해 은이 아니고 A.this
입니다.
내부 클래스가 static
인 경우 외부 클래스의 인스턴스를 포함하지 않고 인스턴스화 할 수 있습니다. static
내부 클래스가 아닌 경우 외부 클래스의 인스턴스가 인스턴스화에 필요합니다. 비 static
내부 클래스가있을 때 뒤에서
// simply
A.B b = new A.B();
// however
A.C c = new A().new C();
:
public class A {
public static class B {
}
public class C {
}
}
다음과 같이 그것을 수행해야 C
B
을 인스턴스화하는 방법 : 예를 들어, 클래스 구조는이 경우 인스턴스화 된 클래스의 인스턴스가 생성자에 전달됩니다. 이 때문에 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);
}
는'static' 방법'TopClass.this'을 사용하여 상상 :
당신이 선언 된 생성자를 확인하고 반사를 통해 내부 클래스의 필드를 선언 할 수있는 "무대 뒤에서"일을 확인합니다. –