"일반"내부 클래스에는 Outer 클래스 인스턴스에 대한 숨겨진 (암시 적) 포인터가 있습니다. 이를 통해 컴파일러는 포인터를 입력하지 않고도 포인터를 추적하는 코드를 생성 할 수 있습니다. 예를 들어 외부 클래스에 "a"변수가있는 경우 내부 클래스의 코드는 "a = 0"을 수행 할 수 있지만 컴파일러는 숨겨진 포인터를 아래에 유지하면서 "outerPointer.a = 0"에 대한 코드를 생성합니다. 커버.
즉, 내부 클래스의 인스턴스를 만들 때 연결할 외부 클래스의 인스턴스가 있어야합니다. 외부 클래스의 메서드 내에서이 생성을 수행하면 컴파일러는 "this"를 암시 적 포인터로 사용하는 것을 알고 있습니다. 다른 외부 인스턴스에 연결하려면 특별한 "새"구문을 사용합니다 (아래 코드 스 니펫 참조).
내부 클래스를 "정적"으로 만들면 숨겨진 포인터가없고 내부 클래스가 외부 클래스의 멤버를 참조 할 수 없습니다. 정적 내부 클래스는 일반 클래스와 동일하지만 이름은 부모 내부에서 범위가 지정됩니다.
다음은 정적 및 비 정적 내부 클래스를 만드는 구문을 보여주는 코드 스 니펫입니다.
public class MyClass {
int a,b,c; // Some members for MyClass
static class InnerOne {
int s,e,p;
void clearA() {
//a = 0; Can't do this ... no outer pointer
}
}
class InnerTwo {
//MyClass parentPointer; Hidden pointer to outer instance
void clearA() {
a = 0;
//outerPointer.a = 0 The compiler generates this code
}
}
void myClassMember() {
// The compiler knows that "this" is the outer reference to give
// to the new "two" instance.
InnerTwo two = new InnerTwo(); //same as this.new InnerTwo()
}
public static void main(String args[]) {
MyClass outer = new MyClass();
InnerTwo x = outer.new InnerTwo(); // Have to set the hidden pointer
InnerOne y = new InnerOne(); // a "static" inner has no hidden pointer
InnerOne z = new MyClass.InnerOne(); // In other classes you have to spell out the scope
}
}