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

avec Java Discussion :

Question sur les classes


Sujet :

avec Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Points : 64
    Points
    64
    Par défaut Question sur les classes
    Salut !

    J'ai du mal à comprendre un petit truc concernant les classes.

    Soit la classe A telle que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class A{
        static int i; 
        static void print(){ 
            System.out.println(i);}
    }
    }
    Et le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A a=new A(); A b=new A(); a.i=5; b.i=10; a.print();
    Est censé donné 10, j'ai testé et en effet ça donne bien 10 par contre je ne comprend pas pourquoi...

    Si vous pourriez m'éclairer ^^ Merci !


    PS: c'est peut-être quelque chose de très trivial cependant ça fait un bon bout de temps que je n'ai pas touché de java, je suis encore un peu perdu...

  2. #2
    Membre éclairé Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Points : 803
    Points
    803
    Par défaut
    parce que i est static, ce qui veut dire que c'est le même pour tous les membres de la classe. T'es même censé écrire A.i, si je me souviens bien de mes warnings...
    Sans danger si utilisé conformément au mode d'emploi.

    (anciennement BenWillard, enfin moins anciennement que ... enfin bon c'est une longue histoire... Un genre de voyage dans le temps...)

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2012
    Messages
    3 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3 020
    Points : 16 093
    Points
    16 093
    Par défaut
    Salut, extrait de la doc :

    Citation Envoyé par documentation java
    Sometimes, you want to have variables that are common to all objects. This is accomplished with the static modifier. Fields that have the static modifier in their declaration are called static fields or class variables. They are associated with the class, rather than with any object. Every instance of the class shares a class variable, which is in one fixed location in memory. Any object can change the value of a class variable, but class variables can also be manipulated without creating an instance of the class.
    http://docs.oracle.com/javase/tutori...classvars.html

    En gros, quand tu déclares une variable statique, elle n'est plus propre à une instance donnée comme c'est le cas des variables "normales", mais elle est propre à la classe, donc partagée par toutes les instances.

    Dans ton exemple, quand tu fais a.i=5; b.i=10; tu réaffectes deux fois une valeurs à la même variable puisque comme dit précédemment, i est static donc partagé par toutes les instance de la classe A, donc par a et b.

  4. #4
    Modérateur
    Avatar de XxArchangexX
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2012
    Messages
    1 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 159
    Points : 2 323
    Points
    2 323
    Par défaut
    Bonjour,

    Pour éviter de réécrire, une petite citation d'ici :

    Le mot clé static devant une variable (ou méthode) indique que celle-ci n'appartient pas à une instance particulière de la classe. Les variables ou méthodes statiques appartiennent à la classe elle-même. On peux ainsi les utiliser sans avoir une instance créée. De nombreuses classes ont des membres ou méthodes statiques ...
    Par ici => FAQ java

    Pour faire simple, c'est une variable de classe (qui est liée à la classe A ) et non uniquement aux instances a, b ...
    L'Etat est bien administré quand l'escalier de l'école est usé et que l'herbe croît sur celui du tribunal.

    Modérateur BI

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Points : 64
    Points
    64
    Par défaut
    D'accord merci pour les réponses, j'y vois plus clair !


    J'en profite pour vous demander autre chose.
    Pourquoi quand on créé 2 objets d'une même classe (A a et A b par exemple), et quand on écrit a=b, les variables de a et de b sont "liées" ?

    Dans mon exemple j'ai une classe A :
    Et le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A a=new A(); A b=new A(); a.i=8; b=a; b.i=5; System.out.println(a.i);
    Affiche 5, pourquoi ce résultat ? Ça parait étrange vu qu'on touche pas à a.i :o

  6. #6
    Membre éclairé Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Points : 803
    Points
    803
    Par défaut
    Euh, c'est un peu le B-A BA de Java...
    Sans danger si utilisé conformément au mode d'emploi.

    (anciennement BenWillard, enfin moins anciennement que ... enfin bon c'est une longue histoire... Un genre de voyage dans le temps...)

  7. #7
    Membre régulier
    Femme Profil pro
    Développeur Java
    Inscrit en
    Août 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Août 2013
    Messages : 61
    Points : 105
    Points
    105
    Par défaut
    Je ne sais pas si tu as déjà fait du C, ou si, un jour de grand vent tu as déjà entendu parler de "références", aussi, je vais essayer de faire simple, en espérant pas trop dire de bêtise car bon, c'est un sujet très abstrait...

    Quand tu fais A a = new A(); tu crée une instance de A, certes, ça c'est ce que te dit Java.. mais ton ordi, lui, il s'en fiche un peu... ce qui lui importe c'est combien ça prend de mémoire et ou il va le ranger pour pas que ce soit le Bronx dans la boutique

    Donc il donne une "adresse" à ton objet (une référence). Ici, a habite au 2 rue de la paix.

    Ensuite tu fais A b = new A(); Jusque là tout va bien, b habite au 15 avenue Foch.

    Puis tu fais b=a, et ton programme traduit "b habite la même adresse que a". Sauf qu'il s'agit d'espace mémoire, on rigole pas avec ces trucs là : b et a ne peuvent pas êtres colocataires au 2 rue de la paix : b "devient" a!

    Quand tu fais par la suite b.i = 5; le programme se rend à l'adresse de b qui est maintenant la même que a, il cherche un int, il le trouve et lui passe la valeur "5" .. et bim!! a.i vaut 5 ... puisque comme tu le souhaitais, b vaut a

    C'est une des raisons pour lesquelles il est préférable de ne pas trop abuser des attributs publics mais c'est une autre histoire

    Bon je me sauve en courant, vu que mon explication est très simpliste j'entends d'ici les puristes rappliquer en râlant

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Points : 64
    Points
    64
    Par défaut
    Merci pour ces précisions ! Ton explication est peut-être "simpliste" mais c'est ce qu'il me faut pour pas que je m'y perde ^^

  9. #9
    Membre régulier
    Femme Profil pro
    Développeur Java
    Inscrit en
    Août 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Août 2013
    Messages : 61
    Points : 105
    Points
    105
    Par défaut
    Ce que je veux dire, c'est qu'il s'agit d'une explication intuitive, qui est proche de la façon dont je le comprends moi même, mais sûrement pas aussi juste que ce que t'en dirait quelqu'un de plus aguerri
    En tout cas, si cela t'intéresse, quand tu seras plus à l'aise tu peux toujours creuser le sujet , perso je trouve ça passionnant !

    Bon courage à toi

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Plus simple, "pointer vers."
    En Java, toute variable de type objet "pointe" vers un objet... Ou vers null.

    A var1 = new A(); signifie "crée un nouvel objet de la class A. Puis déclare une variable var1 qui pointe vers ce nouvel objet."

    Et b = a; signifie "à partir de maintenant, la variable vers b ne pointe plus vers ce qu'elle pointait avant. Elle pointe vers la même chose que a." Du coup, à partir de là, les deux variables pointent le même objet, et donc si on modifie le contenu de cet objet, ben... Peu importe avec quelle variable on accède à l'objet : si son contenu a changé son contenu a changé.

    Quand je dis "b pointe vers la même chose que a" je veux pas dire "a et b sont devenus synonymes." Je veux dire b pointe maintenant vers ce que a pointe maintenant. Si a se met à son tour à pointer un autre objet, grand bien lui fasse. Mais b ne changera pas, lui.


    C'est effectivement le principe des références à la Java. On n'en a rien à cirer de ce que croit la machine et des espaces mémoires.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre régulier
    Femme Profil pro
    Développeur Java
    Inscrit en
    Août 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Août 2013
    Messages : 61
    Points : 105
    Points
    105
    Par défaut
    Merci Thelvin tu as raison je n'avais pas précisé que "a" pouvait à son tour aller pointer ailleurs sans que ça impacte "b" ...

    Juste deux petites remarques (plus pour le plaisir qu'autre chose ...)

    Ce sont, comme tu le dis, "les références à la Java", et ce n'est pas indispensable de se demander "Mais pourquoi, non d'une pipe!!" mais ça peut être intéressant
    Quant à la machine, elle ne croit pas, elle exécute : ce sont toi et moi qui croyons, fous d' humains que nous sommes!! (oué oué j'ai un bac philo, ça m'échappe parfois )

Discussions similaires

  1. question sur les classes "static"
    Par Asmod_D dans le forum C++
    Réponses: 4
    Dernier message: 05/04/2009, 18h27
  2. Questions sur les classes.
    Par Lartiste007 dans le forum Débuter
    Réponses: 4
    Dernier message: 05/04/2009, 15h46
  3. Questions sur les classes.
    Par DarkSeiryu dans le forum Windows Forms
    Réponses: 8
    Dernier message: 06/02/2009, 10h21
  4. Un question sur les classes
    Par willycat dans le forum C++
    Réponses: 10
    Dernier message: 22/08/2008, 18h55
  5. Questions sur les classes en C#
    Par greg2 dans le forum C#
    Réponses: 11
    Dernier message: 05/11/2007, 20h57

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