IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

notions de variables static


Sujet :

Langage Java

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    988
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 988
    Par défaut notions de variables static
    Bonjour,

    Voici le code d'une classe nommée "CARTE".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
     
    import java.io.*;
    import javax.swing.*;
    public class Carte {
     
    	int couleur;// couleur de la carte du jeu(carreau, pique,coeur,trèfle)
    	int figure;// figure de la carte tire de "As" à "Roi"
    	static String[]nomCouleur = {"pique", "coeur","carreau","trefle"};
    	static String[]nomFigure = {"AS","deux","trois","quatre","cinq","six","sept","huit","neuf","dix","valet","dame","roi"};
    		// tableau nomFigure initialisé de éAs" à "Roi"
     
    	Carte(int c, int f)
    	{
    		this.couleur = c;
    		this.figure = f;
     
    	}
    	public int getPoint(){
    		if(this.figure>=10)
    		{return 10;
    		} 
    		else
    		{
    			return this.figure +1;
    		}
    		}// fin de méthode getPoint qui permet de connaître le nombre de pont que rappoete chaque carte
     
    	public static Carte choisirCarte()
    	{
    		int c = (int) (Math.random()*4);
    		int f = (int) (Math.random()*13);
    		return new Carte(c,f);
     
    	}
     
     
    	public String afficherCarte()
    	{
    	 return (nomFigure[figure]+ " de " +nomCouleur[couleur]);	
    	}
     
    }// fin de classe Carte
    Pouvez vous répondre à ces questions concernant ce code :

    1-Que change le fait de déclarer les variables [] nomCouleur et []nomFigure en tant que variables statiques.

    Le seul endroit où la méthode affichercarte est appelée est la méthode
    afficher joueur de la classe joueur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public  void afficherjoueur(){
     
     
    		for(int i =0;i<=nbreTirage-1;i++)
    		{
    			this.texte_cartes_tirees=this.texte_cartes_tirees +" "+ tabCarte[i].afficherCarte(); ;
    				}// fin de for 
     
     
    		 this.texte_final_joueur = this.texte_final_joueur + "le joueur "+this.nom+ " a obtenu  "+ this.totalPoint + " points  avec les cartes  "+ this.texte_cartes_tirees;
     
     
    		}// fin de méthode afficherJoueur
    2-Si la méthode getPoint était déclarée private, pouvez vous me confirmer qu'elle ne pourrait pas être appelée en dehors de la classe carte

    Merci beaucoup de votre aide.
    Cordialement.

    Nathalie

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Citation Envoyé par harbonne Voir le message
    1-Que change le fait de déclarer les variables [] nomCouleur et []nomFigure en tant que variables statiques.
    Les variables statiques dépendent de la classe en général et non d'une instance de cette classe en particulier.
    Donc ici, tu auras une seule instance du tableau nomCouleur et une seule instance du tableau nomFigure (instanciées au moment de la première instanciation d'un objet Carte). Si tu modifies un de ces tableaux il sera modifié pour tous les objets Carte (cependant je doute qu'ils soient appelés à être modifiés ; tu pourrais donc même les déclarer final).
    A contrario, les champs couleur et figure ne sont pas statiques : leur valeur est propre à chaque Carte.

    Citation Envoyé par harbonne Voir le message
    2-Si la méthode getPoint était déclarée private, pouvez vous me confirmer qu'elle ne pourrait pas être appelée en dehors de la classe carte
    oui

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    988
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 988
    Par défaut variables statiques
    Je te remercie de ta réponse.
    Cependant, comme tu le dis dans ta réponse, peut on parler d'instanciation ou plutôt de création en mémoire des tableaux nomCouleur et nomFigure, puisqu'il ne s'agit pas de variables d'instance.
    Donc ici, tu auras une seule instance du tableau nomCouleur et une seule instance du tableau nomFigure (instanciées au moment de la première instanciation d'un objet Carte).
    Merci encore de ta réponse.

    Cordialement.

    Nathalie

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Citation Envoyé par harbonne Voir le message
    peut on parler d'instanciation ou plutôt de création en mémoire des tableaux nomCouleur et nomFigure, puisqu'il ne s'agit pas de variables d'instance
    Un tableau est un objet. Il peut donc (et doit, d'ailleurs ou sinon c'est un tableau null et ça ne sert à rien :p) être instancié. Instanciation = création en mémoire du tableau.
    Je ne comprends pas la question

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 171
    Par défaut
    non, tu peux instancier se que tu veux dans ta class, mais le mot satic indique que la variable declarer static n'appartient a une instance comme les autre, mais a la class, c'est a dire a tout les instance a la fois.

    par exemple si la valeur d'une variable static est changé par une instance quelconque, elle le sera pour tous les instances.

    c'est en fait une chause collectif entre tous les objets d'une class. tu avais rêson de mettre couleur de carte Static, car tous les cartes on l'une de ses couleur

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    988
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 988
    Par défaut variables statiques
    Bonjour et merci beaucoup de vos réponses.

    Pour ce qui est de la dernière réponse, peux tu me donner un exemple où une variable statique est changée depuis une instance d'une classe.
    Normalement une variable statique n'est pas accessible depuis une variable d'instance puisque c'est une variable de classe et pour y acceder on écrit Nomdeclasse.nom_variable_statique.

    Merci à vous de vos réponses.

    Cordialement.
    Nathalie

  7. #7
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Par défaut
    Pour faire simple ,
    Si tu as une classe "Joueur" qui contient une variable static nombreDeJoueurs.
    Tu pourrais incrémenter cette variable à chaque instanciation d'un Joueur (dans le constructeur?).

    De cette manière , tous les "Joueur" que tu créés auront tous la variable nombreDeJoueurs qui est en faite la même pour toutes les instances de la classe.

    Static = de classe.

    Ceci simplement à titre d'exemple pour t'éclairer.

    J'espère avoir pu t'aider.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 171
    Par défaut
    je voulais pas dire qu'elle est accessible par les instances non!
    se que je voulez vous dire c'est que, dans le constructeur ou n'import qu'elle methodes tu peux changer cette valeurs comment par exemple l'incrementer et elle sera changer dans tous les autres instances

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    988
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 988
    Par défaut variable static et instances d'une classe
    Bonjour et merci de ces précisions.
    Si à un instant t1, j'ai crée une instance carte 1 de la classe carte qui contient les variables statiques de type tableau nomCouleur et nomFigure et qu'après avoir crée carte1 , c'est à dire à un instant t2, je change la valeur de nomCouleur et celle de nomFigure( j'y ajoute un élement par exemple à ces deux tableaux), est ce que, au niveau de Carte1, nomCouleur et nomFigure auront la dernière valeur affectée à ces variables à l'instant t2 ou est ce que ces variables garderont la valeur qui leur a été donnée la première fois à l'instant t1.

    Merci encore de votre(vos) réponse(s).
    Cordialement.
    Nathalie

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Citation Envoyé par harbonne Voir le message
    Si à un instant t1, j'ai crée une instance carte 1 de la classe carte qui contient les variables statiques de type tableau nomCouleur et nomFigure et qu'après avoir crée carte1 , c'est à dire à un instant t2, je change la valeur de nomCouleur et celle de nomFigure( j'y ajoute un élement par exemple à ces deux tableaux), est ce que, au niveau de Carte1, nomCouleur et nomFigure auront la dernière valeur affectée à ces variables à l'instant t2 ou est ce que ces variables garderont la valeur qui leur a été donnée la première fois à l'instant t1.
    Réponse rapide : oui, les variables "changeront" de valeur pour Carte1.
    Mais en fait la question est mal posée, et donc cette réponse est inexacte

    En fait il n'y a pas de variable nomCouleur définie "au niveau de Carte1". Il y a une variable statique nomCouleur définie au niveau de la classe Carte, et une seule valeur est stockée en mémoire pour cette variable. Il n'y a pas de "copie" de la variable au niveau des instances, la phrase "ces variables garderont la valeur qui leur a été donnée la première fois à l'instant t1" n'a pas de sens. Donc quel que soit le moment et l'endroit où on modifie l'unique variable Carte.nomCouleur, lorsque plus tard on ré-accédera à cette variable on retrouvera bien sûr la dernière valeur qui lui a été attribuée.
    Attention : Pour lire la valeur de la variable statique on appelle "Carte.nomCouleur" ; au sein de la classe Carte, on peut aussi écrire simplement "nomCouleur" dans le code, mais ça revient au même que d'écrire "Carte.nomCouleur" en entier. Il s'agit toujours d'une variable dépendant de la classe et non dépendant d'une quelconque instance.

    Je réécris ta question :
    - au moment t1 je crée une instance Carte1 de la classe Carte
    - au moment t2 je modifie Carte.nomCouleur
    - au moment t3 je lis Carte.nomCouleur (ou, pour reprendre le "au niveau de Carte1" : j'utilise une méthode de Carte appliquée à l'instance Carte1, qui lit Carte.nomCouleur)
    Dis comme ça, il est évident qu'on va bien retrouver en t3 les modifications effectuées en t2

  11. #11
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Par défaut
    J'allais le dire , on ne peut pas être plus clair

    Rappelle toi juste qu'une variable statique colle à la classe et est partagée par toutes ces instances

Discussions similaires

  1. [C++] Pb avec les variable static dans les classe
    Par quantik-revolution dans le forum C++
    Réponses: 3
    Dernier message: 03/03/2006, 18h40
  2. [C#] Variable static
    Par fremsoi dans le forum Windows Forms
    Réponses: 12
    Dernier message: 25/01/2006, 21h07
  3. [VB6]Initialiser une variable Static dans un évenement
    Par loverdose dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 20/01/2005, 14h57
  4. [héritage] héritage d'une variable static
    Par yaya44 dans le forum Langage
    Réponses: 14
    Dernier message: 29/09/2004, 13h36
  5. Variable static avec thread
    Par oxor3 dans le forum Threads & Processus
    Réponses: 7
    Dernier message: 27/08/2004, 11h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo