2013-08-13 6 views
1

enter image description here정적 중첩 클래스가 외부 클래스의 "this"포인터에 액세스 할 수없는 이유는 무엇입니까?

저를 귀찮게하는 것은 두 번째 요점입니다.

"this"포인터가 정적이 아니므로 내부 클래스가 액세스 할 수 없다는 사실과 관련이 있다고 생각했습니다. 비록 그게 올바른 설명인지 모르겠다.

또 다른 질문이 제기되었습니다. "이"포인터는 어디에 정의되어 있습니까? "

+0

는'static' 방법'TopClass.this'을 사용하여 상상 :

당신이 선언 된 생성자를 확인하고 반사를 통해 내부 클래스의 필드를 선언 할 수있는 "무대 뒤에서"일을 확인합니다. –

답변

11

static가 아닌 static 중첩 클래스 한 차이는 static 내부 클래스는 아니지만 비 static 내부 클래스의 인스턴스가 클로징 클래스의 특정 인스턴스와 연관된 정확하게이다. 여기서 static 내부 클래스의 인스턴스에 대해 이 아니고 A.this입니다.

+0

고마워요. 분명해졌습니다. – Shookie

+0

한 가지 더 말하자면, 내부 클래스가 둘러싼 클래스의 특정 인스턴스와 연결되어 있다고 할 때, 관련된 인스턴스를 변경할 수 있다는 의미입니까? – Shookie

+0

아니요, 할 수 없습니다. 그것의'ParentClass.this' 참조는 그것이 생성 될 때 할당되고, 그것이 그것입니다. – chrylis

2

내부 클래스가 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 { 
    } 
} 

다음과 같이 그것을 수행해야 CB을 인스턴스화하는 방법 : 예를 들어, 클래스 구조는이 경우 인스턴스화 된 클래스의 인스턴스가 생성자에 전달됩니다. 이 때문에 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); 
}