JavaRush /Blog Java /Random-FR /Classes imbriquées statiques

Classes imbriquées statiques

Publié dans le groupe Random-FR
Bonjour! Nous continuons à explorer le sujet des classes imbriquées en Java. Dans la dernière leçon, nous avons parlé des classes imbriquées non statiques ou, comme on les appelle aussi, des classes internes. Classes imbriquées statiques - 2Aujourd'hui, passons à un autre groupe et examinons de plus près les classes imbriquées statiques. Classes imbriquées statiques - 3En quoi sont-ils différents des autres groupes ? Lors de la déclaration d'une telle classe, nous utilisons le mot-clé static déjà familier :
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 une classe externe Boeing737qui crée un avion de ce modèle. Et il a un constructeur avec un seul paramètre : l'année de fabrication ( int manufactureYear). Il existe également une variable statique int maxPassengersCount: le nombre maximum de passagers. Ce sera le même pour tous les avions du même modèle, nous n’avons donc besoin que d’un seul exemplaire. De plus, il dispose d’une classe interne statique Drawing– plan d’avion. Dans cette classe, nous pouvons encapsuler toutes les informations de service sur l'avion. Dans notre exemple, par souci de simplicité, nous l'avons limité à l'année de fabrication, mais il peut contenir bien d'autres informations. Classes imbriquées statiques - 5Comme nous l'avons vu dans la dernière leçon, la création d'une telle classe imbriquée augmente l'encapsulation et favorise une abstraction plus réaliste. Quelle est la différence entre les classes imbriquées statiques et non statiques ? 1. Un objet de classe statique Drawingne stocke pas de référence à une instance spécifique de la classe externe. Rappelez-vous l'exemple du dernier cours avec un vélo :
public class Bicycle {

   private String model;
   private int mawWeight;

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

   public void start() {
       System.out.println("Go!");
   }

   public class SteeringWheel {

       public void right() {
           System.out.println("Steering wheel to the right!");
       }

       public void left() {

           System.out.println("Steering wheel to the left!");
       }
   }

}
Nous y avons expliqué comment SteeringWheelune référence à un objet de la classe externe (vélo) est transmise à chaque instance de la classe interne (volant) sans que nous nous en rendions compte Bicycle. Sans un objet de la classe externe, un objet de la classe interne ne pourrait tout simplement pas exister. Ce n'est pas vrai pour les classes imbriquées statiques. Un objet d’une classe imbriquée statique peut facilement exister seul. À cet égard, les classes statiques sont plus « indépendantes » que les classes non statiques. Le seul point 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 le cours Drawingstatique, alors que lors du dernier cours, le cours Seat(siège de vélo) était non statique ? Comme la dernière fois, ajoutons un peu de "philosophie" pour comprendre l'exemple :) Contrairement à un siège de vélo, l'essence du dessin n'est pas si étroitement liée à l'essence de l'avion. Un objet siège séparé, sans vélo, n'aura le plus souvent aucun sens (mais pas toujours - nous en avons parlé dans la dernière leçon). L’essence du dessin a un sens en soi. Par exemple, cela peut être utile aux ingénieurs qui planifient des réparations d’avions. Ils n’ont pas besoin de l’avion lui-même pour la planification et peuvent être situés n’importe où – un simple dessin suffit. De plus, pour tous les avions du même modèle, le dessin sera toujours le même, il n'y a donc pas de connexion aussi rigide qu'un siège avec un vélo. Par conséquent, l’objet Drawingn’a pas besoin d’un lien vers un objet aéronautique spécifique. 2. Accès différent aux variables et méthodes d'une classe externe. Une classe imbriquée statique ne peut accéder qu'aux champs statiques de la classe externe. Dans notre exemple, la classe Drawingpossède une méthode getMaxPassengersCount()qui renvoie la valeur d'une variable statique maxPassengersCountprovenant d'une classe externe. Cependant, nous ne pouvons pas créer de méthode getManufactureYear()pour Drawingrenvoyer une valeur manufactureYear. Après tout, une variable manufactureYearn’est pas statique, ce qui signifie qu’elle doit appartenir à une instance spécifique Boeing737. Et comme nous l'avons déjà découvert, dans le cas de classes imbriquées statiques, l'objet de la classe externe peut facilement manquer. D'où la limitation :) Le modificateur d'accès de la variable statique dans la classe externe n'a pas d'importance. Même si c’est le cas private, il y aura toujours un accès à partir d’une classe imbriquée statique. Tout ce qui précède concerne non seulement l’accès aux variables statiques, mais aussi aux méthodes statiques. IMPORTANT! Le mot staticdans une déclaration de classe interne ne signifie pas qu'un seul objet peut être créé. Ne confondez pas les objets avec les variables. Si nous parlons de variables statiques, oui, une variable de classe statique, par exemple, maxPassangersCountexiste en un seul exemplaire. Mais lorsqu'il est appliqué à une classe imbriquée, staticcela signifie uniquement que ses objets ne contiennent pas de références aux objets de la classe externe. Et nous pouvons créer autant d’objets que nous le souhaitons :
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 méthode main()directement dans la classe imbriquée (il n'y a pas de raison particulière à cela - juste pour que vous sachiez que c'est possible) et avons créé 5 objets Drawing. Malgré le fait que nous n'avons pas un seul objet d'une classe externe. Comme vous pouvez le voir, il n'y a eu aucun problème :) Résultat de la console :

Drawing{id=1}
Drawing{id=2}
Drawing{id=3}
Drawing{id=4}
Drawing{id=5}
Ceci conclut notre leçon ! Juste au cas où, je vous laisse un lien vers la section les concernant dans la documentation Oracle . Lisez-le s'il y a des points flous. Il est maintenant temps de résoudre quelques problèmes ! :)
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION