CodeGym/Blog Java/Random-FR/Classes imbriquées statiques
Auteur
John Selawsky
Senior Java Developer and Tutor at LearningTree

Classes imbriquées statiques

Publié dans le groupe Random-FR
membres
Salut! Nous continuons à explorer le sujet des classes imbriquées en Java. Dans le dernier exercice, nous avons parlé des classes imbriquées non statiques, également appelées classes internes. Classes imbriquées statiques - 1Aujourd'hui, nous passons à un autre groupe de classes. Nous allons considérer les classes imbriquées statiques. Classes imbriquées statiques - 3En quoi sont-ils différents des autres classes ? Lors de la déclaration de ce type de classe, nous utilisons le mot-clé static, que vous connaissez déjà :
public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

       public static int getMaxPassengersCount() {

           return maxPassengersCount;
       }
   }
}
Classes imbriquées statiques - 4Dans cet exemple, nous avons la Boeing737classe externe, qui représente un avion de ce type. Il a un constructeur avec un paramètre : l'année de fabrication ( int manufactureYear). Il existe également une variable statique : le nombre maximum de passagers ( int maxPassengersCount). Il aura la même valeur pour tous les avions du même modèle, nous n'avons donc besoin que d'une seule instance. De plus, il a une classe imbriquée statique : Drawing(représentant les plans d'ingénierie de l'avion). Nous utilisons cette classe pour encapsuler toutes les informations officielles sur l'avion. Dans notre exemple, pour plus de simplicité, nous avons limité cette classe à l'année de fabrication, mais elle pourrait contenir beaucoup d'autres informations. Classes imbriquées statiques - 5Comme nous l'avons dit dans la dernière leçon, la création d'une telle classe imbriquée améliore l'encapsulation et contribue à une abstraction plus réaliste. Quelle est la différence entre les classes imbriquées statiques et non statiques ? 1. Un objet de la Drawingclasse statique ne stocke pas de référence à une instance spécifique de la classe externe. Rappelez-vous l'exemple du vélo de la dernière leçon :
public class Bicycle {

   private String model;
   private int maxWeight;

   public Bicycle(String model, int maxWeight) {
       this.model = model;
       this.maxWeight = maxWeight;
   }

   public void start() {
       System.out.println("Let's go!");
   }

   public class Handlebar {

       public void right() {
           System.out.println("Steer right!");
       }

       public void left() {

           System.out.println("Steer left!");
       }
   }

}
Dans cette leçon, nous avons parlé du fait que chaque instance de la Handlebarclasse interne, imperceptiblement pour nous, passe une référence à l'instance de la Bicycleclasse externe. Sans une instance de la classe externe, un objet de la classe interne ne pourrait tout simplement pas exister. Pour les classes imbriquées statiques, ce n'est pas le cas. Un objet d'une classe imbriquée statique est tout à fait capable d'exister par lui-même. À cet égard, les classes statiques sont plus "indépendantes" que non statiques. La seule chose que vous devez savoir est que lors de la création d'un tel objet, vous devez spécifier le nom de la classe externe :
public class Main {

   public static void main(String[] args) {

       Boeing737.Drawing drawing1 = new Boeing737.Drawing();
       Boeing737.Drawing drawing2 = new Boeing737.Drawing();
   }
}
Pourquoi avons-nous rendu la Drawingclasse statique alors que dans la dernière leçon nous avons fait laSeatclasse (représentant la selle du vélo) non statique ? Comme la dernière fois, ajoutons un peu de "philosophie" afin de comprendre l'exemple :) Contrairement à un siège de vélo, le concept de dessin technique n'est pas lié de manière rigide au concept d'avion. Sans vélo, un objet siège de vélo séparé n'aurait le plus souvent aucun sens (mais pas toujours, nous en avons parlé dans la dernière leçon). Le concept de dessin technique prend tout son sens. Par exemple, cela pourrait être utile aux ingénieurs qui planifient la maintenance des avions. L'avion n'est pas nécessaire pour faire le plan et peut être placé n'importe où. Seul le dessin technique est nécessaire. De plus, tous les avions du même modèle auront le même dessin d'ingénieur, il n'y a donc pas de relation aussi étroite que celle qui existe avec un siège de vélo. Par conséquent, unDrawingobjet n'a pas besoin d'une référence à un objet avion spécifique. 2. Accès différent aux variables et aux méthodes de la classe externe. Une classe imbriquée statique ne peut accéder qu'aux champs statiques d'une classe externe. Dans notre exemple, la Drawingclasse a une getMaxPassengersCount()méthode qui renvoie la valeur de la maxPassengersCountvariable statique de la classe externe. Cependant, nous ne pouvons pas créer de getManufactureYear()méthode dans la Drawingclasse pour renvoyer la valeur de manufactureYear. Après tout, la manufactureYearvariable est non statique, ce qui signifie qu'elle doit appartenir à une instance spécifique de Boeing737. Et comme nous l'avons déjà découvert, dans le cas des classes imbriquées statiques, l'objet de la classe externe peut facilement être absent. D'où la limitation :) Peu importe le modificateur d'accès qu'une variable statique a dans la classe externe. Même si c'estprivate, une classe imbriquée statique aura toujours accès. Tout ce qui précède s'applique non seulement à l'accès aux variables statiques, mais également aux méthodes statiques. IMPORTANT! Dans la déclaration d'une classe interne, le staticmot clé ne signifie pas que vous ne pouvez créer qu'un seul objet. Ne confondez pas les objets avec les variables. Si nous parlons de variables statiques, alors, oui, il existe une seule instance d'une variable de classe statique, par exemple, maxPassangersCount. Mais quand staticest appliqué à une classe imbriquée, cela signifie seulement que ses objets ne contiennent pas de références aux objets de la classe externe. Et nous pouvons créer autant d'objets eux-mêmes que nous le voulons :
public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

       private int id;

       public Drawing(int id) {
           this.id = id;
       }

       public static int getPassengersCount() {

           return maxPassengersCount;
       }

       @Override
       public String toString() {
           return "Drawing{" +
                   "id=" + id +
                   '}';
       }

       public static void main(String[] args) {

           for (int i = 1; i < 6; i++) {

               Boeing737.Drawing drawing = new Boeing737.Drawing(i);
               System.out.println(drawing);
           }
       }
   }
}
Nous avons déclaré la main()méthode directement dans la classe imbriquée (il n'y a pas de raison particulière à cela — seulement pour vous faire savoir que c'est possible), et avons créé 5 Drawingobjets. Malgré le fait que nous n'avons pas un seul objet de la classe externe. Comme vous pouvez le voir, cela n'a créé aucun problème :) Sortie de la console :
Drawing{id=1}
Drawing{id=2}
Drawing{id=3}
Drawing{id=4}
Drawing{id=5}
Et cela conclut notre leçon ! Au cas où, je vous laisserai un lien vers la section à leur sujet dans la documentation Oracle . Si quelque chose n'est toujours pas clair, lisez-le. Il est maintenant temps pour moi de résoudre quelques tâches ! :)
Commentaires
  • Populaires
  • Nouveau
  • Anciennes
Tu dois être connecté(e) pour laisser un commentaire
Cette page ne comporte pas encore de commentaires