Java et variable static [Fermé]

Signaler
Messages postés
658
Date d'inscription
dimanche 8 juillet 2007
Statut
Membre
Dernière intervention
29 juin 2010
-
Marco la baraque
Messages postés
998
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
-
Bonjour,

on vient de commencer le java au cours du soir et y'a un exercice que je n'arrive pas à résoudre ni même à comprendre pourquoi ça ne fonctionne pas quand on change une variable. Je m'explique :

c'est un code qui fait simplement une boucle qui compte des instances jusque 10.
il n'y a qu'une seule classe et les variables et méthodes sont private static. Dans les cours, on nous demande que se passera-t-il si numInstances n'est pas static. J'ai donc changé et enlevé static de numInstances ainsi que des deux méthodes mais j'ai toujours des erreurs.... Je ne vois pas ce qui ne fonctionne, si quelqu'un connait la solution, je suis preneur...

voici le code :

class CountInstances
{
    private static int numInstances = 0;

    private static int getNumInstances()
    {    
        return numInstances;
    }
    private static void addInstances()
    {
        numInstances++;
    }

public static void main (String[] args)
{
    System.out.println("nous commencons avec "+CountInstances.getNumInstances()+"instance");
    for (int i = 0; i < 10; i++)
    {
        CountInstances x = new CountInstances();
        x.addInstances();
        System.out.println("nous avons maintenant "+CountInstances.getNumInstances()+" instances");
    }
}
}

3 réponses

Messages postés
998
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
321
Bonjour,
La réponse :
- en gardant le static, ça donne :
nous avons maintenant 1 instances
nous avons maintenant 2 instances
nous avons maintenant 3 instances
nous avons maintenant 4 instances
nous avons maintenant 5 instances
nous avons maintenant 6 instances
nous avons maintenant 7 instances
nous avons maintenant 8 instances
nous avons maintenant 9 instances
nous avons maintenant 10 instances

- en enlevant le static :
nous avons maintenant 1 instances
nous avons maintenant 1 instances
nous avons maintenant 1 instances
nous avons maintenant 1 instances
nous avons maintenant 1 instances
nous avons maintenant 1 instances
nous avons maintenant 1 instances
nous avons maintenant 1 instances
nous avons maintenant 1 instances
nous avons maintenant 1 instances

Et maintenant l'explication :
Le static sur un attribut sert à déclarer des attributs de classe : toutes les instances de cette classe vont partager la même donnée. Ainsi si tu fais :
CountInstances a = new CountInstances();
CountInstances b = new CountInstances();
a.addInstances;
System.out.println(b.getNumInstances());

Ca va t'afficher 1 (alors que tu n'as jamais incrémenté l'attribut de b).

Le mot clé static sur une méthode te permet de l'appeler sans instancier la classe (par exemple int a = CountInstances.getNulInstances();). En fait, toutes les méthodes utilisant un attribut déclaré en static doivent être static.

En enlevant les static, l'attribut devient un attribut d'instance, et donc chaque instance possède sa propre données.
CountInstances a = new CountInstances();
CountInstances b = new CountInstances();
a.addInstances;
System.out.println(b.getNumInstances());

Ca va t'afficher 0 (parce que tu n'as jamais touché à l'attribut de b).

En espérant avoir été clair.

Cordialement,
11
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 70514 internautes nous ont dit merci ce mois-ci

Messages postés
37927
Date d'inscription
jeudi 4 avril 2002
Statut
Non membre
Dernière intervention
29 mars 2020
1 750
class CountInstances
{
    private  int numInstances = 0;

    private  int getNumInstances()
    {    
        return numInstances;
    }
    private void addInstances()
    {
        numInstances++;
    }

public static void main (String[] args)
{
    CountInstances x = new CountInstances();
     System.out.println("nous commencons avec "+x.getNumInstances()+"instance");
    for (int i = 0; i < 10; i++)
    {
        x.addInstances();
        System.out.println("nous avons maintenant "+ x.getNumInstances()+" instances");
    }
}
}


Normalement ça marche ... Quand tu fais appel à une méthode statique, tu n'es pas tenu d'instancier ta classe.
Par contre, si les méthodes ne sont pas statique, avant de faire quoi que soit, il faut instancier cette classe
Messages postés
37927
Date d'inscription
jeudi 4 avril 2002
Statut
Non membre
Dernière intervention
29 mars 2020
1 750
Salut

mets nous ton code après la modification des méthodes et des variables en non static ...

quoi que je crois déjà connaître la réponse ..