Flux rss
Collection CommentCaMarche.net

Le mot-clé static ou les attributs et méthodes de classe en POO

Publié par kilian, dernière mise à jour le dimanche 23 novembre 2008 à 05:20:42 par kilian


(NOTE: Cet article explique la signification du mot-clé static au sein d'une classe. La signification de "static" en C n'a par exemple rien à voir.)

Vous êtes débutant en programmation orientée objet. En Java, en C++...ou que sais-je encore., vous êtes tombé sur le mot "static". Et vous ne savez pas bien pourquoi. Vous ne savez pas bien comment. Vous ne savez pas bien d'où... Mais pourtant il existe.

Voici donc un petit éclaircissement.



Le gâteau et la recette


Attributs d'instance


Nous sommes samedi après-midi, et ce soir vous recevez des amis. Vous avez la riche idée, pour le dessert, de leur préparer un gâteau.
Mais le problème, c'est que vous ne savez pas bien comment faire. Les desserts c'est pas votre truc.
Vous décidez alors de créer un gâteau: le plimpandard.
Vous ouvrez vos placard et votre frigo, et tout ce que vous trouvez, c'est ça:
  • Du beurre
  • Des œufs
  • De la farine
  • Du sucre
  • Des carottes

Vous avez que ça, mais alors vous en avez plein!
Ça vous laisse de quoi essayer. Mouais pourquoi pas. Au pire, on essaiera avec des dosages différents au fur et à mesure des essais.

3 heures plus tard

C'est le troisième plimpandard que vous essayez de faire. Y'en a un qui est tout plat. Y'en a un qui a brûlé, et un autre qui était pas mal mais vous l'avez mangé parce que vous aviez trop faim.
Faut en refaire un.
Y'en a marre, vous êtes un geek, pas un pâtissier et là vous avez envie de programmer, pas de faire des gâteaux. Mais vous vous dites que vous pourriez joindre l'utile à l'agréable.

Pourquoi ne pas modéliser votre recette en Java pour faire des statistiques: dans quel cas il est trop plat, dans quel cas il est trop amer etc...

Alors où est le gâteau, ou est la recette?
La recette, c'est ce qui est constant, ce qui est commun à tous vos plimpandards. C'est-à-dire le fait qu'il y a du beurre, de la farine, des carottes etc....

Le plimpandard, quant à lui, est variable et on peut en faire plein. Il seront tous différents.

Alors vous vous dites que la recette est une classe et que les gâteaux produits à partir de cette recette sont les instances de cette classe: les objets.

Alors voilà ce que ça donne:
class Gateau
{
    public int farine;
    public int sucre;
    public int oeufs;
    public int beurre;
    public int carotte;

    public Gateau(int farine, int sucre, int oeufs, int beurre, int carotte)
    {
        this.farine = farine;
        this.sucre = sucre;
        this.oeufs = oeufs;
        this.beurre = beurre;
        this.carotte = carotte;
    }

    public void cuire()
    {
         ....
    }
}

Notez que ces variables seront propres à chaque plimpandard que vous ferez. Le dosage de farine de l'un ne sera pas forcément le même qu'un autre. Et si vous remettez du sucre un peu plus tard avant la cuisson, ce changement ne se répercutera que sur le plimpandard sur vous aurez rajouté de la farine, pas sur les autres.

Exemple:
//On crée deux plimpandards
Gateau a = new Gateau(100, 200, 3, 120, 4);
Gateau b = new Gateau(100, 200, 1, 120, 5);

a.farine = 400; //On fout une bonne pâtée de farine

System.out.println(a.farine); // Affichera 400
System.out.println(b.farine); // Affichera 100

Comme vous pouvez le voir, le changement dans a ne s'est pas répercuté dans b.

C'est ce qu'on appelle une variable d'instance, ou attribut d'instance. Il est propre à un seul objet, chaque objet possède son propre exemplaire.

Attributs de classe


Vous lâchez votre code deux secondes, et touché par la grâce, vous refaites un plimpandard, complètement réussi cette fois.
Vous l'adorez, ce gâteau. Du coup, vous vous dites que vous aimeriez bien que les gens sachent comment il s'appelle. Mais vous êtes conscient que les langues changent avec le temps, les noms aussi. Si votre gâteau a du succès, il y a fort à parier que la recette ira jusqu'en Ardèche en 2030, et que les gens voudront l'appeler le "métatron".

Vous faites face à un nouveau problème: vous voudriez une variable "nom" qui ait la même valeur pour tous vos gâteaux. Vous voudriez que si ce nom est changé, le changement se répercute sur tous les gâteaux.

L'idéal franchement, ce serait d'inscrire ce nom sur la recette et vous laisseriez n'importe qui donner le nom qu'il veut à ce gâteau

Imaginons: je crée deux plimpandards, je vis en Ardèche et on est en 2030. Vous placez un gâteau dans le salon, un autre dans la cuisine. Vous vous dites que Plimpandard c'est vraiment un nom ridicule, vous barrez le nom sur la recette et vous l'appelez "Métatron".
Quelqu'un arrive dans la cuisine et se demande ce que vous préparez. Il regarde la recette et voit "Métatron". Il s'exclame: un "Métatron, ça l'air bon, ça sent super bon la carotte!!".

Il va dans le salon et il s'exclame de nouveau: "Wah un autre métatron, génial!!".
Le pari est gagné, le changement s'est répercuté sur tous les gâteaux de la recette.

Un autre exemple, libérez votre recette sur internet: changez le nom plimpandard en métatron. Tous les gens qui verront la recette sauront que ça s'appelle un métatron. Les gâteaux qu'ils feront à partir de cette recette, ils l'appelleront toujours métatron.

Maintenant si vous n'aviez pas changé ça sur la recette mais sur le gâteau (en gravant son nom avec un couteau par exemple), le changement se répercutera sur ce gâteau là, mais pas sur les autres qui garderont le nom plimpandard.

Ce genre de variable, commune à toutes les instances d'une classe, et partagée par toutes les instances d'une classe s'appelle une variable de classe, ou attribut de classe.
Pour définir ce genre de variable, on utilise le mot-clé "static".
Pour y accéder, on utilise le nom de la classe suivi d'un point puis du nom de l'attribut.
Ça fonctionne aussi en utilisant le nom de l'objet suivi d'un point puis de l'attribut.

Exemple:
class Gateau
{
    public static String nom;

    public int farine;
    public int sucre;
    public int oeufs;
    public int beurre;
    public int carotte;

    public Gateau(int farine, int sucre, int oeufs, int beurre, int carotte)
    {
        this.farine = farine;
        this.sucre = sucre;
        this.oeufs = oeufs;
        this.beurre = beurre;
        this.carotte = carotte;
    }

    public void cuire()
    {
         ....
    }
}

Gateau.nom = "Plimpandard";

Gateau a = new Gateau(100, 200, 3, 120, 4);
Gateau b = new Gateau(100, 200, 1, 120, 5);

System.out.println(a.nom); //affiche "Plimpandard"

a.nom = "Metatron";
System.out.println(b.nom); //Affiche "Métatron"

Comme vous pouvez le voir ici, le changement dans a s'est répercuté dans b.

Le robot faiseur de Plimpandard


Les méthodes de classe


C'est bien beau tout ça, mais vous avez grandi et vous avez commercialisé votre recette, ça a fait un tabac ce Plimpandard! Et vous avez même engagé des ingénieurs pour améliorer la recette.
Ils ont remarqué que les jours de pleine lune, les plimpadards étaient un peu fades et avaient besoin d'un peu plus de carottes. Sans compter que ça permettait aux gens d'avoir un meilleur teint sous la lumière blanche de la lune. C'était un bon coup de pub et les gens étaient heureux d'avoir un joli teint grâce au Plimpandard.

Alors vous avez commercialisé un robot intelligent capable de produire des plimpandards avec des dosages de carottes dépendants du cycle lunaire.
Il suffit de lui mettre plein d'œufs, de beurre, de farine, de carotte dans un petit réservoir et il est capable de vous produire votre gâteau avec le parfait dosage pour magnifier votre teint.

En l'utilisant chez lui, un petit jeune mordu de Java décide de faire des statistiques sur les dosages du robot en fonction de la lune.
Les gâteau sont des objets, pas de problème, mais il se dit que le robot contient la recette, et qu'en plus de ça il est capable de doser en fonction de la lune. Il remarque aussi que le robot possède un compteur qui montre combien de gâteaux il a créé dans sa vie.

Alors il se dit: le robot est la classe puisqu'il est aussi la recette, mais en plus de ça il compte le nombre de gâteaux qu'il produit: on a une variable statique car ce nombre sera inscrit dans le robot (la recette) et en plus il est capable de produire des gâteaux. On va alors utiliser une méthode statique. C'est-à-dire une méthode qui se trouve dans une classe et qui peut être utilisée par tout le monde.

Notez que le robot se comporte comme une recette, la seule différence, c'est que c'est une recette capable de faire elle-même des gâteaux et qui le fait de manière intelligente.

Voilà ce que ça donne:
class Gateau
{
    public static String nom;
    public static nbGateauCree = 0;

    public int farine;
    public int sucre;
    public int oeufs;
    public int beurre;
    public int carotte;

    public static Gateau creeGateau(boolean pleineLune)
    {
         Geateau ret;

         if (pleineLune)
             ret = new Gateau(100, 200, 3, 120, 1000);
         else
             ret = new Gateau(100, 200, 3, 120, 500);

         nbGateauCree++;
         return ret;
    }

    private Gateau(int farine, int sucre, int oeufs, int beurre, int carotte)
    {
        this.farine = farine;
        this.sucre = sucre;
        this.oeufs = oeufs;
        this.beurre = beurre;
        this.carotte = carotte;
    }

    public void cuire()
    {
         ....
    }
}

//On crée un gâteau de pleine lune
Gateau a = Gateau.creeGateau(true);

//On crée un gâteau durant une lune en croissant
Gateau b = Gateau.creeGateau(false);

System.out.println(b.nbGateauCree); //Affiche 2

On remarque plusieurs choses ici. D'abord le constructeur est privé. Effectivement avec ce robot, on ne peut plus créer soi-même de plimpandard avec le dosage que l'on veut. C'est le robot qui décide.
Donc vous n'avez pas accès au constructeur par vous-même. Mais le robot, lui, a le droit. Effectivement une méthode statique fait partie d'une classe et a accès à tout.

Ce que ne peuvent pas faire les méthodes statiques


Voici ce que ne peut pas faire une méthode statique:
static void machin()
{
    thic.c = this.a + this.b;
    .....
}

Ceci est faux, nous sommes dans un contexte de classe et non pas d'objet (d'instance).
Imaginons que vous ayez la recette de votre gâteau sur internet. En utilisant un formulaire, vous pouvez changer le nom du gâteau dans la recette.
Si vous essayez ceci:
static void changeNom(String nom)
{
    this.nom = nom;
}

Ceci est faux, le mot this représente l'objet courant, c'est à dire un gâteau quelconque créé à partir de la recette. Or vous n'êtes pas dans un gâteau particulier, vous êtes dans la recette. Comment la recette peut-elle savoir à quel gâteau vous faites référence? Il y a eu plus de mille gâteaux créés à partir de cette recette.
Le mot-clé this est tout simplement interdit dans une méthode statique.
Classe Static VS classe "singletone" (Résolu) Bonjour Cette question me tracasse depuis un certain moment ,alors donnez votre avis: Quelle est la différence entre une classe Static et une classe "singletone"(en java bien sûr)? merci à l'avance www.commentcamarche.net/forum/affich-1905932-classe-static-vs-classe-singletone
Java - L'accessibilité La notion d'accessibilité Le concept d'accessibilité (généralement appelé encapsulation) définit la possibilité qu'a le concepteur d'une classe de restreindre l'accès à certaines données, ou plus généralement à certains éléments (méthodes, classes,... www.commentcamarche.net/contents/java/javaaccess.php3
Supprimer complètement un programme Malgré la désinstallation d'un programme, il se peut que des clés de registre ou des fichiers soient encore présents sur le PC. Si la méthode "classique" (clic droit/supprimer) ne fonctionne pas, il suffit d'utiliser l'éditeur du registre. Mise en... www.commentcamarche.net/faq/sujet-519-supprimer-completement-un-programme
Comment utiliser efficacement les moteurs de recherche ?Comment utiliser efficacement les moteurs de recherche ? Si Internet représente une masse d'informations colossale, il peut être fastidieux de trouver le renseignement que vous recherchez. Pourtant, il est possible d’optimiser ses requêtes pour... www.commentcamarche.net/faq/sujet-9383-comment-utiliser-efficacement-les-moteurs-de-recherche
Certificat et signature électroniqueCertificat et signature électronique Utiliser la signature électronique dans l'entreprise Le certificat électronique est un document numérique permettant de valider le lien entre une signature électronique et son signataire. La signature... www.commentcamarche.net/faq/sujet-9607-certificat-et-signature-electronique
[Windows] Ma clé USB n'apparaît pas dans l'explorateurDans certains cas, il arrive que la clé USB soit reconnue par Windows (elle clignote ou est allumée), mais elle n'apparaît pas dans l'explorateur de Windows. Voici comment la forcer. Méthode 1 (Rapide) Menu Démarrer > Exécuter >... www.commentcamarche.net/faq/sujet-4511-windows-ma-cle-usb-n-apparait-pas-dans-l-explorateur
Clé usb (Résolu)Bonjour, Bonjour, Je souhaite acheter un cadre photo numérique avec possibilité d'y insérer une clé USB 2.0 classique sur laquelle j'ai transféré des photos. Le cadre qui me conviendrait - cooldevice 15 " CADR 0030 - indique dans ses... www.commentcamarche.net/forum/affich-6429284-cle-usb
Transfert fichiers...cle usb... (Résolu)Bonjour, comment faire pour transferrer des fichiers d'un micro équipé de windos xp pro vers un micro equipé de vista professionnel: -avec cordon ethernet,par cd ,cle usb...autre... -methodologie suite: -y a t'il une différence entre une cle... www.commentcamarche.net/forum/affich-4524356-transfert-fichiers-cle-usb
Programmation orientée objet (Résolu)Bonjour j'ai trois petites questions sur la programmation orientée objet. Je commence à comprendre un peu certaines définitions, mais il reste encore des zones floues pour moi. 1) qu'est ce qu'un attribut de classe par rapport à un... www.commentcamarche.net/forum/affich-2060549-programmation-orientee-objet
Télécharger Classic CalendarClassic Calendar est un calendrier qui fournit une méthode rapide pour gérer les évènements. Il vous suffit de l'ouvrir, de cliquer sur une date, d'entrer une note et de visualiser ce dernier en surbrillance. Les notes sont automatiquement... www.commentcamarche.net/telecharger/telecharger-34057639-classic-calendar
Télécharger SteamSteam est un agent de téléchargement de jeux en ligne permettant de les acheter et de les télécharger. Par rapport à une installation classique depuis un CD ou DVD, cette méthode présente plusieurs avantages. Notamment, elle élimine les problèmes de... www.commentcamarche.net/telecharger/telecharger-34055456-steam
Télécharger RSS OwlRSSOwl est un lecteur RSS très complet offrant un support des principaux standards (RSS/Atom) et surtout une interface intuitive permettant de classer et organiser ses flux RSS, ainsi que de gérer des alertes par mots clés. www.commentcamarche.net/telecharger/telecharger-34055544-rss-owl
Atlantis Land I-Fly Wireless RouterAlgorithme de cryptage:WEP,WPA,WPA2,WEP 64/128 bit,DES,3DES,AES],Line coding format:QPSK,BPSK,CCK,OFDM,Fréquence:2.4GHz,Protocole de Routing :RIP1, RIP2, STATIC ROUTING,IP, ICMP, TCP, UDP, IGMP,Méthode de Spread Spectrum:OFDM,DSSS,Protocole de Remote... www.commentcamarche.net/guide-achat/atlantis-land-i-fly-wireless-router-872432-fiche-technique
Linksys WAG325NWAG 325 325 N 325N 325N, Protocole de Remote Management:HTTP, Méthode de Spread Spectrum:OFDM, DSSS, Protocole de Routing :RIP-1, RIP-2, static IP routing, Protocole de Switching :Ethernet, Protocole de Transport :PPTP, L2TP, IPSec, PPPoE, PPPoA, Vitesse. www.commentcamarche.net/guide-achat/linksys-wag325n-927111-fiche-technique
JVC UX-G33G 33, Chaîne Fixe, Type de chaîne:Fixe, Puissance:2x30 watts, Type d'enceintes: , Nombre de pré-selections: , Divers:Active Hyper Bass PRO treats a dynamically bass and clear votes · Watch and classes by 3 administrate, Formats supportés:CD, CD www.commentcamarche.net/guide-achat/jvc-ux-g33-569902-fiche-technique
PHP - Les classesLa notion de classe Php3 intègre un soupçon de caractéristiques empruntées aux langages orientés objet, c'est-à-dire la possibilité d'utiliser des objets, entités regroupant des données et des fonctions au sein d'une structure et rendant la... www.commentcamarche.net/contents/php/phpclass.php3
Java - Premier programmePremière application avec Java La première chose à faire est de créer un simple fichier texte (sans mise en forme) et de taper les quelques lignes suivantes : // Votre premiere application en Java class FirstApp { public static void main... www.commentcamarche.net/contents/java/javaprem.php3
Java - ConstructeursLe constructeur: une méthode particulière Pour instancier une classe, c'est-à-dire créer un objet à partir d'une classe, il s'agit d'utiliser l'opérateur new. En réalité l'opérateur new, lorsqu'il est utilisé, fait appel à une méthode spéciale de... www.commentcamarche.net/contents/java/javaconst.php3