Eine "reguläre" innere Klasse hat einen versteckten (impliziten) Zeiger auf eine Instanz der äußeren Klasse. Auf diese Weise kann der Compiler den Code generieren, um den Zeiger für Sie zu verfolgen, ohne dass Sie ihn eingeben müssen. Wenn es beispielsweise eine Variable "a" in der äußeren Klasse gibt, kann der Code in Ihrer inneren Klasse nur "a = 0" ausführen, aber der Compiler generiert Code für "OuterPointer.a = 0", wobei der versteckte Zeiger unter beibehalten wird die Abdeckungen.
Das heißt, wenn Sie eine Instanz einer inneren Klasse erstellen, müssen Sie eine Instanz einer äußeren Klasse haben, mit der Sie sie verknüpfen können. Wenn Sie diese Erstellung innerhalb einer Methode der äußeren Klasse durchführen, kann der Compiler "this" als impliziten Zeiger verwenden. Wenn Sie eine Verknüpfung zu einer anderen äußeren Instanz herstellen möchten, verwenden Sie eine spezielle "neue" Syntax (siehe Codefragment unten).
Wenn Sie Ihre innere Klasse "statisch" machen, gibt es keinen versteckten Zeiger und Ihre innere Klasse kann nicht auf Mitglieder der äußeren Klasse verweisen. Eine statische innere Klasse ist identisch mit einer regulären Klasse, ihr Name ist jedoch innerhalb des übergeordneten Elements festgelegt.
Hier ist ein Codeausschnitt, der die Syntax zum Erstellen statischer und nicht statischer innerer Klassen demonstriert:
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
}
}