Una clase interna "regular" tiene un puntero oculto (implícito) a una instancia de clase externa. Esto permite que el compilador genere el código para perseguir el puntero por usted sin tener que escribirlo. Por ejemplo, si hay una variable "a" en la clase externa, entonces el código en su clase interna puede hacer "a = 0", pero el compilador generará código para "externalPointer.a = 0" manteniendo el puntero oculto debajo las portadas.
Esto significa que cuando crea una instancia de una clase interna, debe tener una instancia de una clase externa para vincularla. Si realiza esta creación dentro de un método de la clase externa, el compilador sabe usar "esto" como puntero implícito. Si desea vincular a alguna otra instancia externa, utilice una sintaxis especial "nueva" (consulte el fragmento de código a continuación).
Si hace que su clase interna sea "estática", entonces no hay un puntero oculto y su clase interna no puede hacer referencia a miembros de la clase externa. Una clase interna estática es idéntica a una clase regular, pero su nombre está dentro del padre.
Aquí hay un fragmento de código que demuestra la sintaxis para crear clases internas estáticas y no estáticas:
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
}
}