statique fonctionne classe (imbriquée) exactement de la même manière qu'une classe de niveau supérieur. La seule différence est que son nom a un autre nom de classe le préfixant. (Si vous regardez les fichiers .class compilés, vous verrez que vous obtiendrez quelque chose comme "Outer $ Nested.class" pour une classe nommée imbriquée imbriquée dans une classe nommée Outer.)
un champ caché qui est une référence à l'instance contenant de sa classe externe.Lorsque vous écrivez:
class Outer {
final int x;
class Nested {
int y;
Nested(int y) {
this.y = y;
}
int bar() {
return x + y;
}
}
void foo() {
Nested n = new Nested(5);
}
}
Il est comme si vous aviez écrit:
class Outer {
final int x;
static class Nested {
Outer outer;
int y;
Nested(Outer outer, int y) {
this.outer = outer;
this.y = y;
}
int bar() {
return outer.x + y;
}
}
void foo() {
Nested n = new Nested(this, 5);
}
}
Le nom de ce champ caché (que je l'ai appelé « extérieur » ici) est caché à vous, si vous pouvez vous y référer en disant Outer.this
à l'intérieur de la classe interne (où Outer
est le nom de votre classe-dehors, bien sûr). De même, notez que lorsqu'une méthode dans la classe interne fait référence à quelque chose dans la classe externe, cette référence est en réalité via cette référence cachée à la classe externe.
Il y a quelques complications supplémentaires concernant le fonctionnement du contrôle d'accès (par exemple: private) avec les classes imbriquées/internes, mais cela n'affecte pas vraiment la question de "mémoire" que vous posez.
Le "comment" est un détail de mise en œuvre, non spec définie. Cela dit, ce livre ne vous dit pas comment une implémentation Java le fait réellement, mais il vous dit comment une machine virtuelle de type Java peut le faire: http://www1.idc.ac.il/tecs/ – Dinah