« Salut Amigo ! »

« Salut, Élie ! »

"Aujourd'hui, nous avons un sujet très intéressant. Aujourd'hui, je vais vous parler des classes imbriquées."

"Si une classe est déclarée à l'intérieur d'une autre classe, il s'agit alors d'une classe imbriquée. Les classes imbriquées non statiques sont appelées classes internes."

"Les objets d'une classe interne sont imbriqués dans les objets de la classe externe et peuvent donc accéder aux variables de la classe externe."

Exemple
public class Car
{
 int height = 160;
 ArrayList doors = new ArrayList();

 public Car
 {
  doors.add(new Door());
  doors.add(new Door());
  doors.add(new Door());
  doors.add(new Door());
 }

class Door()
 {
  public int getDoorHeight()
  {
   return (int)(height * 0.80);
  }
 }
}

"Notez que la classe Door a une méthode getDoorHeight. Elle utilise la variable de hauteur de l'objet Car et renvoie la hauteur de la porte."

Classes imbriquées - 1

"Un objet Door ne peut pas exister indépendamment d'un objet Car. Après tout, il utilise les variables de l'objet Car. Le compilateur ajoute de manière invisible au constructeur et à la classe Door une référence à l'objet Car extérieur, de sorte que les méthodes de la classe Door intérieure peut accéder aux variables de la classe Car externe et appeler ses méthodes."

"Objets imbriqués. Cela a du sens pour moi. À en juger par le diagramme, tout est assez simple."

"Et c'est ainsi. A part quelques nuances."

"La classe intérieure Door a une référence à l'objet Car, donc :"

1) Vous ne pouvez pas créer d'objet Door dans une méthode statique de la classe Car, car les méthodes statiques ne contiennent pas de référence à l'objet Car qui est implicitement passé au constructeur Door.

Correct Incorrect
public class Car
{
 public static Door createDoor()
 {
  Car car = new Car();
  return car.new Door();
 }

 public class Door
 {
  int width, height;
 }
}
public class Car
{
 public static Door createDoor()
 {
  return new Door();
 }

 public class Door
 {
  int width, height;
 }
}

2) La classe Door ne peut pas contenir de variables ou de méthodes statiques.

Correct Incorrect
public class Car
{
 public int count;
 public int getCount()
 {
  return count;
 }

 public class Door
 {
  int width, height;
 }
}
public class Car
{

 public class Door
 {
  public static int count;
  int width, height;

  public static int getCount()
  {
   return count;
  }
 }
}

"Et si j'ai besoin d'une variable partagée par tous les objets Door ?"

"Vous pouvez toujours simplement le déclarer dans la classe Car. Il sera alors partagé par tous les objets Door imbriqués dans un objet Car."

3) Remarque : si la classe interne est déclarée publique, des instances de celle-ci peuvent être créées en dehors de la classe externe, mais une instance de la classe externe doit d'abord exister :

Car car = new Car();
Car.Door door = car.new Door();
Car.Door door = new Car().newDoor();

4) Et encore un commentaire que j'ai failli oublier.

"Puisque nous avons deux objets imbriqués, les méthodes de l'objet interne ont accès à deux références appelées 'this' :"

public class Car
{
 int width, height;

 public class Door
 {
  int width, height;

  public void setHeight(int height)
  {
   this.height = height;
  }

 public int getHeight()
 {
  if (height != 0)
   return this.height;
  else
   return (int)(Car.this.height * 0.8);
 }
}

"J'ai délibérément déclaré des variables du même nom dans les classes."

"Pour accéder à une variable de la classe externe lorsqu'elle est masquée, ou pour accéder à 'this' à l'intérieur d'une classe interne, écrivez simplement 'YourClassName.this' :"

Comment accéder au 'this' d'une classe externe (ou de toute autre)
Car.this
Car.Door.this
Car.Door.InnerClass2.InnerClass3.this

"Donc, si nous écrivons 'ceci' dans la méthode d'une classe interne, alors 'ceci' fait référence à la classe interne?"

"Oui, exactement."

« Que penses-tu des classes internes, Amigo ? »

"Ils sont très intéressants. Je ne dirais pas qu'ils sont trop difficiles."

"Il y a beaucoup de restrictions, mais elles semblent assez logiques après que vous ayez expliqué d'où viennent ces restrictions et pourquoi elles existent."

"De plus, j'écris des classes imbriquées dans des tâches depuis deux mois, mais ce n'est que maintenant que je réalise ce que j'ai vraiment écrit."

"Merci pour cette excellente leçon, Ellie."

"Je suis content que ça te plaise, Amigo."