Historique de la question :
Dès le début, Java a introduit la notion de membres statiques de classe, qui diffèrent des membres d'instance — ces variables sont stockées au niveau de la classe, et non de l'objet. Cela permet de partager des données entre toutes les instances de la classe ou d'utiliser des constantes et des structures de service.
Problème :
La principale fonction des champs statiques est de fournir des données pour tous les objets de la classe ou d'implémenter un point d'accès unique. Cependant, une mauvaise utilisation de static peut entraîner des erreurs difficiles à détecter, liées à un état global, des courses de données et des problèmes lors des tests.
Solution :
Les champs statiques sont déclarés avec le mot-clé static :
public class Counter { public static int globalCount = 0; public Counter() { globalCount++; } }
À chaque création d'instance, le compteur augmente, et la valeur est accessible via Counter.globalCount, indépendamment de l'objet.
Caractéristiques clés :
Peut-on accéder à un champ statique via un objet, plutôt que par le nom de la classe ?
Oui, la syntaxe permet d'accéder à un champ statique via un objet, mais cela conduit à un code peu lisible, et parfois déroutant. Il est préférable de toujours accéder via le nom de la classe.
Counter c = new Counter(); System.out.println(c.globalCount); // Fonctionne, mais n'est pas recommandé
Les champs statiques peuvent-ils être privés ?
Oui, le niveau d'accès n'est pas limité. Les champs statiques privés sont souvent utilisés avec des méthodes statiques publiques (par exemple, pour le Singleton) :
public class Singleton { private static Singleton instance; public static Singleton getInstance() { if (instance == null) instance = new Singleton(); return instance; } }
Que se passe-t-il si l'on essaie d'initialiser un champ statique avec une valeur dépendante d'un champ non statique ?
Un tel code ne se compilera pas, car les champs non statiques sont initialisés après les champs statiques. Un champ statique ne peut pas référencer un champ non statique directement.
Dans de grandes applications, un champ static est utilisé pour stocker des données mises en cache qui sont spécifiques à l'utilisateur.
Avantages :
Inconvénients :
Utilisation de public static final String pour stocker des constantes (par exemple, des codes d'erreur ou des paramètres standards).
Avantages :
Inconvénients :