Premièrement, il existe quatre types de classes imbriquées (classes définies dans la classe):
――Les deux ont les utilisations suivantes --Lors de l'utilisation d'un objet uniquement dans la classe englobante [^ 1] --Si vous souhaitez masquer l'implémentation de la classe imbriquée dans la classe parente
Pour enregistrer les noms de premier niveau
Le comportement change légèrement selon que de l'électricité statique est ajoutée ou non.
MyObject.java
public class OuterObject{
String outer = "";
static void method() {
InnerStaticObject innerStaticObject = new InnerStaticObject();
InnerObject innerObject = new InnerObject(); //Erreur de compilation
}
/**classe imbriquée statique**/
private static class InnerStaticObject {
void method() {
System.out.println(outer); //Erreur de compilation
System.out.println(OuterObject.this.outer); //Erreur de compilation
}
}
/**Classe imbriquée non statique**/
private class InnerObject {
void method() {
System.out.println(outer); //Peut être référencé
System.out.println(OuterObject.this.outer); //Peut être référencé
}
}
}
Fondamentalement, il semble préférable de l'utiliser avec statique car un non statique apporte une dépendance supplémentaire.
Classes définies dans les méthodes, les constructeurs, les blocs d'initialisation, les clauses if et d'autres blocs
――Il a les utilisations suivantes --Si vous souhaitez masquer l'implémentation de la classe dans un bloc
MyObject.java
class MyObject {
private void method() {
//Classe intérieure locale
class LocalInnerClass implements MyInterface {
@Override
public void print() {
System.out.println("Local Inner Class");
}
}
LocalInnerClass localInnerClass = new LocalInnerClass ();
localInnerClass.print();
}
}
interface MyInterface {
void print();
}
Une classe sans nom de classe
――Il a les utilisations suivantes
MyObject.java
class MyObject {
private void method() {
//Classe anonyme
MyInterface myInterface = new MyInterface() {
@Override
public void print() {
System.out.println("Anonymous Class");
}
};
myInterface.print();
}
}
interface MyInterface {
void print();
}
[^ 1]: Classe englobante: la classe en dehors de la classe interne
Recommended Posts