Ils sont intérieur (imbriquées et non statiques) :
public class Outer {
public class Inner { public void foo() { ... } }
}
Vous pouvez le faire :
Outer outer = new Outer();
outer.new Inner().foo();
ou simplement :
new Outer().new Inner().foo();
La raison en est que Inner
a une référence à une instance spécifique de la classe externe. Permettez-moi de vous donner un exemple plus détaillé :
public class Outer {
private final String message;
Outer(String message) {
this.message = message;
}
public class Inner {
private final String message;
public Inner(String message) {
this.message = message;
}
public void foo() {
System.out.printf("%s %s%n", Outer.this.message, message);
}
}
}
et courir :
new Outer("Hello").new Inner("World").foo();
Sorties :
Hello World
Note : les classes imbriquées peuvent être static
aussi. Si c'est le cas, ils n'ont pas d'implicite this
référence à la classe externe :
public class Outer {
public static class Nested {
public void foo() { System.out.println("Foo"); }
}
}
new Outer.Nested.foo();
Le plus souvent, les classes statiques imbriquées sont private
car il s'agit généralement de détails d'implémentation et d'une bonne façon d'encapsuler une partie d'un problème sans polluer l'espace de noms public.