Il peut y avoir des moments où il est utile d'avoir des valeurs partagées entre toutes les instances d'une classe particulière. Les champs statiques et les constantes statiques permettent ce type de partage en appartenant à la classe et non aux objets réels.
Normalement, les champs et méthodes définis dans une classe ne peuvent être utilisés que lorsqu'un objet de ce type de classe a été créé. Par exemple, considérons une classe Item simple qui assure le suivi des marchandises dans un magasin:
élément de classe publique
chaîne privée itemName;
Élément public (String itemName)
this.itemName = itemName;
public String getItemName ()
return itemName;
Pour pouvoir utiliser la méthode getItemName (), nous devons d'abord créer un objet Item, dans ce cas, catFood:
classe public StaticExample
public static void main (String [] args)
Article catFood = nouvel article ("Whiskas");
System.out.println (catFood.getItemName ());
Cependant, si le modificateur statique est inclus dans une déclaration de champ ou de méthode, aucune instance de la classe n'est requise pour utiliser le champ ou la méthode - ils sont associés à la classe et non à un objet individuel. Si vous regardez l'exemple ci-dessus, vous verrez que le modificateur statique est déjà utilisé dans la déclaration de méthode principale:
Publique statique void main (String [] args)
La méthode principale est une méthode statique qui ne nécessite pas qu'un objet existe avant de pouvoir être appelé. Comme main () est le point de départ de toute application Java, il n'y a en fait aucun objet existant pour l'appeler. Vous pourriez, si vous aviez envie d'avoir un programme qui s'appelle continuellement, faire ceci:
classe public StaticExample
public static void main (String [] args)
String [] s = "random", "string";
StaticExample.main (s);
Pas très utile, mais remarquez comment la méthode main () peut être appelée sans une instance d'une classe StaticExample.
Les champs statiques sont également appelés champs de classe. Ce sont simplement des champs qui ont le modificateur statique dans leurs déclarations. Par exemple, revenons à la classe Item et ajoutons un champ statique:
élément de classe publique
// champ statique uniqueId
private static int uniqueId = 1;
private int itemId;
chaîne privée itemName;
Élément public (String itemName)
this.itemName = itemName;
itemId = uniqueId;
uniqueId ++;
Les champs itemId et itemName sont des champs non statiques normaux. Lorsqu'une instance d'une classe Item est créée, ces champs auront des valeurs qui sont conservées à l'intérieur de cet objet. Si un autre objet Item est créé, il aura également des champs itemId et itemName pour stocker les valeurs.
Le champ statique uniqueId, cependant, contient une valeur qui sera la même pour tous les objets Item. S'il y a 100 objets Item, il y aura 100 instances des champs itemId et itemName, mais un seul champ statique uniqueId.
Dans l'exemple ci-dessus, uniqueId est utilisé pour donner à chaque objet Item un numéro unique. Cela est facile à faire si chaque objet Item créé prend la valeur actuelle dans le champ statique uniqueId, puis l'incrémente d'une unité. L'utilisation d'un champ statique signifie que chaque objet n'a pas besoin de connaître les autres objets pour obtenir un identifiant unique. Cela peut être utile si vous souhaitez connaître l'ordre dans lequel les objets Item ont été créés.
Les constantes statiques sont exactement comme les champs statiques, sauf que leurs valeurs ne peuvent pas être modifiées. Dans la déclaration de champ, le final et statique les modificateurs sont tous deux utilisés. Par exemple, la classe Item devrait peut-être imposer une restriction sur la longueur de itemName. Nous pourrions créer une constante statique maxItemNameLength:
élément de classe publique
int statique privé id = 1;
public static final int maxItemNameLength = 20;
private int itemId;
chaîne privée itemName;
Élément public (String itemName)
if (itemName.length ()> maxItemNameLength)
this.itemName = itemName.substring (0,20);
autre
this.itemName = itemName;
itemId = id;
id ++;
Comme pour les champs statiques, les constantes statiques sont associées à la classe plutôt qu'à un objet individuel:
classe public StaticExample
public static void main (String [] args)
Article catFood = nouvel article ("Whiskas");
System.out.println (catFood.getItemName ());
System.out.println (Item.maxItemNameLength);
Il y a deux choses importantes à noter à propos de la constante statique maxItemNameLength:
Les constantes statiques sont visibles dans toute l'API Java. Par exemple, la classe wrapper d'entier en a deux qui stockent les valeurs maximale et minimale qu'un type de données int peut avoir:
System.out.println ("La valeur maximale pour int est:" + Integer.MAX_VALUE);
System.out.println ("La valeur minimale pour int est:" + Integer.MIN_VALUE);
Production:
La valeur maximale pour int est: 2147483647
La valeur min pour int est: -2147483648