“常规”内部类具有指向 Outer 类实例的隐藏(隐式)指针。这允许编译器生成代码来为您追逐指针,而无需键入它。例如,如果外部类中有一个变量“a”,则内部类中的代码可以只执行“a=0”,但编译器将为“outerPointer.a=0”生成代码,在封面下维护隐藏的指针。
这意味着在创建内部类的实例时,必须有一个外部类的实例来链接到它。如果在外部类的方法中执行此创建,则编译器知道使用“this”作为隐式指针。如果要链接到其他外部实例,请使用特殊的“new”语法(请参阅下面的代码片段)。
如果使内部类为“静态”,则没有隐藏的指针,并且内部类无法引用外部类的成员。静态内部类与常规类相同,但其名称的作用域位于父类内部。
下面是一段代码,演示了用于创建静态和非静态内部类的语法:
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
}
}