「通常の」内部クラスには、外部クラスインスタンスへの非表示の(暗黙の)ポインタがあります。これにより、コンパイラーは、ポインターを入力しなくても、ポインターを追跡するためのコードを生成できます。たとえば、外部クラスに変数「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
}
}