D'abord les définitions...
Une variable static ( qu'on appelle parfois une variable de classe ) est une variable qui nécessite qu'un espace en mémoire pour stocker sa valeur plutôt qu'un espace en mémoire par objet créé, ce qui est le cas pour les variables d'instance.
Par exemple, pour une classe EtudiantCegep, les variables nom et matricule ne sont pas static car chaque objet a son nom et son matricule propre; on a besoin d'un espace-mémoire par objet pour stocker ces informations. Nom et matricule sont des variables d'instance.
Cependant, les variables menuCafeteria et accèsALaBibliotheque sont des variables static car leur valeur est la même, à un instant donné, pour tous les objets EtudiantCegep ( l'accès à la bibliothèque vaut true pour tous les objets en même temps , le menuCafeteria est le même pour tous les étudiants un jour donné ) . On a donc besoin d'un seul espace mémoire pour l'ensemble de la classe pour stocker ces infos; ce sont des variables de classe.
Une méthode static est une méthode dont le résultat est indépendant des variables d'instance d'une classe.
Par exemple, une méthode calculerMoyenneCoursMaths n'est pas une méthode static car son résultat dépend des notes de chacun des étudiants.
Par contre, on pourrait considérer une méthode assignerCasier une méthode static car on assigne pas un casier en fonction du nom, du matricule ou du revenu d'un étudiant...
Les constantes
Les constantes ont tjrs le modificateur static car, par définition, une constante n'a besoin qu'un espace mémoire pour toute la classe ( on a pas besoin de stocker la même valeur dans 1000 objets créés à partir de cette classe )
On peut donc accéder à une constante directement en la précédant du nom de la classe d'où elle vient ( Ex. Font.BOLD )
De la même manière, on peut accéder à une variable statique : Ex: EtudiantCegep.accesBibliotheque ( vaut true ou false pour l'ensemble des étudiants à un instant donné de la semaine )
Une variable statique peut également être un objet, tel un objet Hashtable ( comme dans le TP 2 )
Quand les variables statiques ou les constantes sont initialisées ?
Elles sont chargées en mémoire lors de l'exécution du programme; quand la classe dont les variables font partie est chargée dans la machine virtuelle Java ( en étant présente dans le code d'une classe par exemple ) , ses membres statiques le sont également et sont donc accessibles à tous, que ce soit des objets ou des variables de type prédéfini.
. Par exemple ,
import java.awt.Point;
public class ClasseEssai {
public static Point variableDeClasse = new Point ( 2,3);
}
l'objet Point sera créé dès que cette classe est chargée en mémoire
public class Class1 {
public static void main(String[] args) {
System.out.println(ClasseEssai.variableDeClasse.getX());
}
}
"2" sera affiché.
Peut-on donner le modificateur static à une classe ?
Très rarement, uniquement dans le cas d'une classe interne...c'est un cas assez rare, vous aurez de l'information sur le site d'Oracle ici
Merci à Monique H. pour une expérimentation similaire.