Un "régulier" intérieur de la classe a un caché (implicite) pointeur vers un parent de la classe de l'instance. Cela permet au compilateur de générer le code pour chasser le pointeur pour vous, sans que vous ayez à taper. Par exemple, si il y a une variable "a" dans la classe parent le code dans votre intérieur de la classe suffit de le faire "a=0", mais le compilateur va générer du code pour "parentPointer.a=0" maintenir le pointeur caché sous les couvertures.
Cela signifie que lorsque vous créez une instance de l'un à l'intérieur de la classe, vous devez avoir une instance d'une classe parent d'un lien. Si vous n'cette création à l'intérieur d'une méthode de la classe parente, puis le compilateur sait utiliser "ce" que l'implicite pointeur. Si vous souhaitez mettre un lien vers un autre parent de l'instance, puis vous utilisez un spécial "nouvelle" syntaxe (voir l'extrait de code ci-dessous).
Si vous faire de votre intérieur de la classe "statique" il n'est pas caché pointeur et l'intérieur de votre classe ne peut pas référencer les membres de la classe parent. Un statique à l'intérieur de la classe est identique à une classe ordinaire, mais son nom est étendue à l'intérieur de la mère.
Voici un extrait de code suivant illustre la syntaxe de création d'statiques et non statiques de classes internes:
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 parent pointer
}
}
class InnerTwo {
//MyClass parentPointer; Hidden pointer to parent instance
void clearA() {
a = 0;
//parentPointer.a = 0 The compiler generates this code
}
}
void myClassMember() {
// The compiler knows that "this" is the parent reference to give
// to the new "two" instance.
InnerTwo two = new InnerTwo();
}
public static void main(String args[]) {
MyClass parent = new MyClass();
InnerTwo x = parent.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
}
}