Uma classe interna "regular" possui um ponteiro oculto (implícito) para uma instância de classe externa. Isso permite que o compilador gere o código para perseguir o ponteiro para você sem precisar digitá-lo. Por exemplo, se houver uma variável "a" na classe externa, o código na sua classe interna poderá fazer "a = 0", mas o compilador gerará código para "outerPointer.a = 0" mantendo o ponteiro oculto em As tampas.
Isso significa que, quando você cria uma instância de uma classe interna, é necessário ter uma instância de uma classe externa para vinculá-la. Se você criar essa criação dentro de um método da classe externa, o compilador saberá usar "this" como ponteiro implícito. Se você deseja vincular a outra instância externa, use uma sintaxe "nova" especial (consulte o trecho de código abaixo).
Se você tornar sua classe interna "estática", não haverá ponteiro oculto e sua classe interna não poderá referenciar membros da classe externa. Uma classe interna estática é idêntica a uma classe regular, mas seu nome é definido dentro do pai.
Aqui está um trecho de código que demonstra a sintaxe para criar classes internas estáticas e não 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
}
}