Java et variable static

Fermé
limbergh Messages postés 658 Date d'inscription dimanche 8 juillet 2007 Statut Membre Dernière intervention 29 juin 2010 - 19 sept. 2008 à 11:39
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 - 19 sept. 2008 à 12:13
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");
    }
}
}
A voir également:

3 réponses

Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 328
19 sept. 2008 à 12:13
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
choubaka Messages postés 39375 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 14 avril 2024 2 100
19 sept. 2008 à 12:08
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
6
choubaka Messages postés 39375 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 14 avril 2024 2 100
19 sept. 2008 à 12:04
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 ..
4