JavaRush /Blog Java /Random-FR /10 Notes sur le modificateur statique en Java

10 Notes sur le modificateur statique en Java

Publié dans le groupe Random-FR
Le modificateur static en Java est directement associé à la classe. Si le champ est statique, alors il appartient à la classe, si la méthode est statique, c’est pareil : il appartient à la classe. Sur cette base, vous pouvez accéder à une méthode ou un champ statique en utilisant le nom de la classe. Par exemple, si le champ count est statique dans la classe Counter, alors vous pouvez accéder à la variable avec une requête telle que : Counter.count. 10 Notes sur le modificateur statique en Java - 1Avant de commencer avec les notes, rappelons (et découvrons peut-être) ce qu'est la statique et ce qui peut l'être en Java. Statique est un modificateur appliqué à un champ, un bloc, une méthode ou une classe interne. Ce modificateur indique que le sujet est lié à la classe actuelle.

Champs statiques

Lorsque nous désignons une variable de niveau classe, nous indiquons que la valeur appartient à une classe. Si vous ne le faites pas, la valeur de la variable sera liée à un objet créé à l'aide de cette classe. Qu'est-ce que ça veut dire? 10 Notes sur le modificateur statique en Java - 2Et le fait est que si la variable n'est pas statique, alors chaque nouvel objet de cette classe aura sa propre valeur de cette variable, en la modifiant, nous la changeons exclusivement en un seul objet : Par exemple, nous avons une classe Car avec un non -variable statique :
public class Car {
  int km;
}
Puis en principal :
Car orangeCar = new Car();
orangeCar.km = 100;

Car blueCar = new Car();
blueCar.km = 85;

System.out.println("Orange car - " + orangeCar.km);
System.out.println("Blue car - " + blueCar.km);
Le résultat que nous obtenons est :

Orange car - 100
Blue car - 85
Comme vous pouvez le constater, chaque objet possède sa propre variable, dont le changement ne se produit que pour cet objet. Eh bien, si nous avons une variable statique, alors cette valeur globale est la même pour tout le monde : nous avons maintenant une voiture avec une variable statique :
public class Car {
  static int km;
}
Ensuite, le même code dans main sera affiché sur la console :

Orange car - 85
Blue car - 85
Après tout, nous avons une variable pour nous tous, et à chaque fois nous la modifions. Les variables statiques ne sont généralement pas accessibles par une référence d'objet - orangeCar.km, mais par le nom de classe - Car.km

Bloc statique

Il existe deux blocs d'initialisation : régulier et statique. Le bloc est destiné à initialiser des variables internes. Si le bloc est normal, alors les variables internes de l'objet sont initialisées avec lui, mais s'il est statique, alors des variables statiques (c'est-à-dire des variables de classe) leur sont attribuées. Exemple de classe avec un bloc d'initialisation statique :
public class Car {
  static int km;

  static {
     km = 150;
  }
}

Méthode statique

Les méthodes statiques diffèrent des méthodes classiques dans la mesure où elles sont également liées à une classe plutôt qu'à un objet. Une propriété importante d’une méthode statique est qu’elle ne peut accéder qu’à des variables/méthodes statiques. A titre d'exemple, regardons une classe qui sera une sorte de compteur qui assure le suivi des appels de méthodes :
public class Counter {
  static int count;

  public static void invokeCounter() {
     count++;
     System.out.println("Current counter value - " + count);
  }
}
Appelons-le en principal :
Counter.invokeCounter();
Counter.invokeCounter();
Counter.invokeCounter();
Et nous obtenons le résultat sur la console :

Текущее meaning счётчика - 1
Текущее meaning счётчика - 2
Текущее meaning счётчика - 3

Classe statique en Java

Seule une classe interne peut être une classe statique. Encore une fois, cette classe est liée à la classe externe, et si la classe externe est héritée par une autre classe, alors celle-ci ne sera pas héritée. De plus, cette classe peut être héritée, tout comme elle peut être héritée de n'importe quelle autre classe et implémenter une interface. Essentiellement, une classe imbriquée statique n'est pas différente de toute autre classe interne, sauf que son objet ne contient pas de référence à l'objet de classe externe qui l'a créé. Cependant, cela rend une classe statique plus similaire à une classe classique non imbriquée, car la seule différence est qu'elle est encapsulée dans une autre classe. Dans certains cas, cela constitue un avantage pour nous, puisque nous avons accès aux variables statiques privées de la classe externe. Exemple de classe statique imbriquée :
public class Vehicle {

  public static class Car {
     public int km;
  }
}
Créer une instance de cette classe et définir la valeur de la variable interne :
Vehicle.Car car = new Vehicle.Car();
car.km = 90;
Pour utiliser des méthodes/variables/classe statiques, nous n'avons pas besoin de créer un objet de cette classe. Bien entendu, les modificateurs d’accès doivent être pris en compte. Par exemple, les champs privatene sont accessibles qu'au sein de la classe dans laquelle ils sont déclarés. Les champs protectedsont disponibles pour toutes les classes à l'intérieur d'un package ( package ), ainsi que pour toutes les classes descendantes en dehors du package. Pour plus de détails, consultez l'article « privé vs protégé vs public ». Supposons qu'il existe une méthode statique increment()dans la classe Counterdont la tâche est d'incrémenter le compteur count. Pour appeler cette méthode, vous pouvez utiliser une invocation du formulaire Counter.increment(). Il n'est pas nécessaire d'instancier une classe Counterpour accéder à un champ ou une méthode statique. C'est la différence fondamentale entre les objets statiques et NON statiques (membres de classe). Permettez-moi de vous rappeler encore une fois que les membres de classe statiques appartiennent directement à la classe, pas à son instance. Autrement dit, la valeur d'une variable statique countsera la même pour tous les objets de type Counter. Plus loin dans cet article, nous examinerons les aspects fondamentaux de l'utilisation du modificateur statique en Java, ainsi que certaines fonctionnalités qui vous aideront à comprendre les concepts clés de la programmation.

Ce que tout programmeur devrait savoir sur le modificateur Static en Java

Dans cette section, nous examinerons les bases de l'utilisation des méthodes, des champs et des classes statiques. Commençons par les variables.
  1. Vous ne pouvez pas accéder aux membres non statiques d'une classe dans un contexte statique, tel qu'une méthode ou un bloc. La compilation du code ci-dessous entraînera une erreur :

    public class Counter{
    private int count;
    public static void main(String args[]){
       System.out.println(count); //compile time error
    }}

    C'est l'une des erreurs les plus courantes commises par les programmeurs Java, en particulier les débutants. Puisque la méthode mainest statique, mais que la variable countne l'est pas, dans ce cas, la méthode printlnà l'intérieur de la méthode maingénérera une « erreur de compilation ».

  2. Contrairement aux variables locales, les champs et méthodes statiques ne sont PAS thread-safe en Java. En pratique, c’est l’une des causes les plus courantes de problèmes liés à la sécurité de la programmation multithread. Étant donné que chaque instance d’une classe possède la même copie d’une variable statique, une telle variable doit être protégée – « verrouillée » par la classe. Par conséquent, lorsque vous utilisez des variables statiques, assurez-vous qu'elles sont correctement synchronisées pour éviter des problèmes tels que des conditions de concurrence.

  3. Статические методы имеют преимущество в применении, т.к. отсутствует необходимость каждый раз создавать новый an object для доступа к таким методам. Статический метод можно вызвать, используя тип класса, в котором эти методы описаны. Именно поэтому, подобные методы How нельзя лучше подходят в качестве методов-фабрик (factory), и методов-утorт (utility). Класс java.lang.Math — замечательный пример, в котором почти все методы статичны, по этой же причине классы-утorты в Java финализированы (final).

  4. Другим важным моментом является то, что вы НЕ можете переопределять (Override) статические методы. Если вы объявите такой же метод в классе-наследнике (subclass), т.е. метод с таким же именем и сигнатурой, вы лишь «спрячете» метод суперкласса (superclass) instead of переопределения. Это явление известно How сокрытие методов (hiding methods). Это означает, что при обращении к статическому методу, который объявлен How в родительском, так и в дочернем классе, во время компиляции всегда будет вызван метод исходя из типа переменной. В отличие от переопределения, такие методы не будут выполнены во время работы программы. Рассмотрим пример:

    class Vehicle{
         public static void  kmToMiles(int km){
              System.out.println("Inside parent class/static method");
         } }
    
    class Car extends Vehicle{
         public static void  kmToMiles(int km){
              System.out.println("Inside child class/static method ");
         } }
    
    public class Demo{
       public static void main(String args[]){
          Vehicle v = new Car();
           v.kmToMiles(10);
      }}

    Вывод в консоль:

    Внутри родительского класса/статического метода

    Код наглядно демонстрирует: несмотря на то, что an object имеет тип Car, вызван статический метод из класса Vehicle, т.к. произошло обращение к методу во время компиляции. И заметьте, ошибки во время компиляции не возникло!

  5. Объявить статическим также можно и класс, за исключением классов верхнего уровня. Такие классы известны How «вложенные статические классы» (nested static class). Они бывают полезными для представления улучшенных связей. Яркий пример вложенного статического класса — HashMap.Entry, который предоставляет структуру данных внутри HashMap. Стоит заметить, также How и любой другой внутренний класс, вложенные классы находятся в отдельном файле .class. Таким образом, если вы объявor пять вложенных классов в вашем главном классе, у вас будет 6 файлов с расширением .class. Ещё одним примером использования является объявление собственного компаратора (Comparator), например компаратор по возрасту (AgeComparator) в классе сотрудники (Employee).

  6. Модификатор static также может быть объявлен в статичном блоке, более известным How «Статический блок инициализации» (Static initializer block), который будет выполнен во время загрузки класса. Если вы не объявите такой блок, то Java соберёт все статические поля в один список и выполнит его во время загрузки класса. Однако, статичный блок НЕ может пробросить перехваченные исключения, но может выбросить не перехваченные. В таком случае возникнет «Exception Initializer Error». На практике, любое исключение возникшее во время выполнения и инициализации статических полей, будет завёрнуто Java в эту ошибку. Это также самая частая причина ошибки «No Class Def Found Error», т.к. класс не находился в памяти во время обращения к нему.

  7. Il est utile de savoir que les méthodes statiques sont liées au moment de la compilation, par opposition aux méthodes virtuelles ou non statiques, qui sont liées au moment de l'exécution sur l'objet réel. Par conséquent, les méthodes statiques ne peuvent pas être remplacées en Java car le polymorphisme d'exécution ne s'applique pas à eux. Il s'agit d'une limitation importante à prendre en compte lors de la déclaration d'une méthode statique. Cela n'a de sens que lorsqu'il n'y a aucune possibilité ou nécessité de remplacer une telle méthode en héritant de classes. Les méthodes d'usine et les méthodes utilitaires sont de bons exemples d'utilisation du modificateur statique. Joshua Bloch a souligné plusieurs avantages de l'utilisation d'une méthode de fabrique statique par rapport à un constructeur dans son livre Effective Java , dont la lecture est obligatoire pour tout programmeur du langage.

  8. Une propriété importante d'un bloc statique est l'initialisation. Les champs ou variables statiques sont initialisés après le chargement de la classe en mémoire. L'ordre d'initialisation est de haut en bas, dans le même ordre que celui décrit dans le fichier source de la classe Java. Étant donné que les champs statiques sont initialisés de manière thread-safe, cette propriété est également utilisée pour implémenter le Singleton. Si vous n'utilisez pas de liste Enumcomme Singleton, pour une raison ou une autre, il existe une bonne alternative pour vous. Mais dans ce cas, il faut garder à l’esprit qu’il ne s’agit pas d’une initialisation « paresseuse ». Cela signifie que le champ statique sera initialisé AVANT que quiconque ne le « demande ». Si l'objet est gourmand en ressources ou rarement utilisé, son initialisation dans un bloc statique ne jouera pas en votre faveur.

  9. Lors de la sérialisation, tout comme transientles variables, les champs statiques ne sont pas sérialisés. En effet, si vous enregistrez des données dans un champ statique, alors après désérialisation le nouvel objet contiendra sa valeur primaire (par défaut), par exemple, si le champ statique était une variable de type int, alors sa valeur après désérialisation sera nulle, si le type floatest 0,0, si type Objectnull. Honnêtement, c'est l'une des questions les plus fréquemment posées concernant la sérialisation dans les entretiens Java. Ne stockez pas les données les plus importantes sur un objet dans un champ statique !

  10. Et enfin, parlons-en static import. Ce modificateur a beaucoup en commun avec l'opérateur standard import, mais contrairement à lui, il vous permet d'importer un ou tous les membres statiques d'une classe. Lors de l'importation de méthodes statiques, elles sont accessibles comme si elles étaient définies dans la même classe, de même lors de l'importation de champs, nous pouvons y accéder sans spécifier le nom de la classe. Cette fonctionnalité a été introduite dans Java version 1.5 et, lorsqu'elle est utilisée correctement, améliore la lisibilité du code. Cette construction se retrouve le plus souvent dans les tests JUnit , car Presque tous les développeurs de tests utilisent static importpar exemple des méthodes assert assertEquals()et leurs doublons surchargés. Si rien n'est clair, bienvenue pour plus d'informations .

C'est tout. Chaque programmeur doit connaître tous les points ci-dessus concernant le modificateur statique en Java . Cet article couvre des informations de base sur les variables statiques, les champs, les méthodes, les blocs d'initialisation et les importations. Y compris certaines propriétés importantes, dont la connaissance est essentielle lors de l'écriture et de la compréhension de programmes en Java. J'espère que chaque développeur perfectionnera ses compétences dans l'utilisation de concepts statiques car... C'est très important pour une programmation sérieuse."
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION