Données et méthodes statiques                        

Données et méthodes statiques

           

Avec cet exemple, on voit l'utilisation d'attributs et de méthodes statiques, c'est-à-dire dont la définition débute avec le modificateur static. On rappelle qu'une méthode ou un attribut auquels n'est pas appliqué le modificateur static sont dits d'instance. Un attribut ou une méthode statique (i.e. déclaré avec le mot static) est aussi dit attribut de classe ou méthode de classe.
Un attribut déclaré static (i.e. statique ou de classe) existe dès que sa classe est chargée en mémoire, en dehors et indépendamment de toute instanciation. Quelque soit le nombre d'instanciation de la classe (0, 1, ou plus) un attribut de classe, i.e. statique, existe en un et un seul exemplaire. Un tel attribut sera utilisé un peu comme une variable globale d'un programme non objet.
Une méthode, pour être de classe, ne doit pas manipuler, directement ou indirectement, d'attributs non statiques de sa classe. En conséquence, si une méthode de classe utilise dans son code un attribut ou une méthode non statique de sa classe, une erreur est détectée à la compilation.
De l'extérieur de sa classe ou d'une classe héritée, un attribut ou une méthode de classe pourront être utilisés précédés du nom de sa classe :
    nom_d'une_classe.nom_de_l'attribut_ou_méthode_de_classe)
ou bien (mais cela est moins correct) du nom d'une instance de la classe.
Signalons enfin qu'une méthode static ne peut pas être redéfinie, ce qui signifie qu'elle est automatiquement final.

On trouve un certain nombre de méthodes statiques dans l'API. C'est le cas de toutes les méthodes de la classe java.lang.Math : on pourra ainsi utiliser Math.sin(...) , Math.log(...) , de même que la constante statique Math.PI. On a déjà aussi rencontré la méthode parseInt que est une méthode statique de la classe Integer (invoquée par Integer.parseInt(...));

Nous vous donnons ci-dessous deux exemples concernants les attributs et méthodes statiques

Dans le premier exemple, on définit :


public class Comparaisons {
   static int seuil = 10;

   static int min(int a, int b) {
      if (a < b) return a;
      else return b;
   }

   static boolean grand(int a) {
       return (a > Comparaisons.seuil);
   }
}

class EssaiComparaisons {
   public static void main(String[] arg) {
      int n = Integer.parseInt(arg[0]);
      int p = Integer.parseInt(arg[1]);

      System.out.println("Le plus petit : " + Comparaisons.min(n, p));
      if (Comparaisons.grand(n)) System.out.println(n + " est grand");
      else System.out.println(n + " est petit");

      System.out.println("Le seuil vaut " + Comparaisons.seuil);
  }
}

On obtient à l'exécution, pour les paramètres 12 et 4 :

Le plus petit : 4
12 est grand
Le seuil vaut 10

Pour accéder à ces classes.

Le second exemple suit l'évolution d'un attribut statique de classe.

 public class Compteur {
  public static int compteur = 0;

  public Compteur() {
    compteur++;
  }
}

class EssaiCompteur {
  public static void main(String[] argv) {
    System.out.println("compteur : " + Compteur.compteur);
    Compteur.compteur++;
    System.out.println("compteur : " + Compteur.compteur);
    new Compteur();
    System.out.println("compteur : " + Compteur.compteur);
  }
}

On obtient à l'exécution :

compteur : 0
compteur : 1
compteur : 2  

Pour accéder à ces classes.


return (a > Comparaisons.seuil); : la méthode grand retourne ainsi true si l''inégalité a > Comparaisons.seuil est vérifiée et false dans le cas contraire.
Comparaisons.min(n, p) : une méthode statique est invoquée comme on le voit ici : nom de la classe suivi du nom de la méthode.
Comparaisons.seuil : un attribut statique est invoqué comme on le voit ici : nom de la classe suivi du nom de l'attribut.

© Irène Charon Télécom ParisTech 2010