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 :

Du passage de string par référence


Sujet :

avec Java

  1. #1
    Membre régulier

    Inscrit en
    novembre 2007
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : novembre 2007
    Messages : 121
    Points : 104
    Points
    104
    Par défaut Du passage de string par référence
    Bonsoir,

    J'avais cru comprendre que les objets étaient passés par référence en Java, or avec le code suivant, on s'attend bien à ce que l'objet str soit modifié dans le main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	public static void main(String[] args) {
    		String str = new String("ma_string");
    		System.out.println("str is: " + str);
    		chgString(str);
    		System.out.println("str modified is: " + str);
    	}
     
    	public static void chgString(String string) {
    		System.out.println("str to modify in chgString() method is: " + string);
    		string = new String("string_modifiee");
    		System.out.println("str modified in chgString() method is: " + string);
    	}
    Mais le résultat est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     java -jar test.jar 
    str is: ma_string
    str to modify in chgString() method is: ma_string
    str modified in chgString() method is: string_modifiee
    str modified is: ma_string
    Quelqu'un pourrait-il m'expliquer ce qu'il se passe ?

    Merci bien.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    mars 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 111
    Points : 116
    Points
    116
    Par défaut
    Pour garder la même référence il faut que ta méthode chgString() retourne la référence de l'objet en question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static string  chgString(String string) {
    		System.out.println("str to modify in chgString() method is: " + string);
    		string = new String("string_modifiee");
    		System.out.println("str modified in chgString() method is: " + string);
                   return string;
    	}
    Un geek, c'est quelqu'un qui croit qu'il y a 1024m dans 1km...

    Il y a 10 types de geeks, ceux qui savent compter en binaire et les autres...

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : avril 2002
    Messages : 13 938
    Points : 23 015
    Points
    23 015
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par raf64flo Voir le message
    J'avais cru comprendre que les objets étaient passés par référence en Java
    Les objets sont passé par copie de la référence.

    a++

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2006
    Messages : 90
    Points : 39
    Points
    39
    Par défaut
    En fait ce qu'il se passe c'est que tu ne remplaces pas l'espace mémoire associé à la variable String que tu as créé dans ta fonction main, tu en crées juste un nouveau.

    Ce qu'il faut comprendre c'est qu'une référence ce n'est pas l'endroit dans la mémoire où se trouve la valeur. Donc si tu veux modifier ton String de départ, tu fais comme te l'a dit yorgh1234.

    Et si on reprend ta phrase :

    J'avais cru comprendre que les objets étaient passés par référence en Java, or avec le code suivant, on s'attend bien à ce que l'objet str soit modifié dans le main :
    Tu dis en premier que les objets sont passés par référence, ce qui est vrai et après tu dis que str est un objet, donc tu connaissais la réponse inconsciemment .

    Ciao

  5. #5
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Inscrit en
    avril 2002
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations forums :
    Inscription : avril 2002
    Messages : 4 300
    Points : 12 981
    Points
    12 981
    Par défaut
    Il faut comprendre surtout que la notion de référence en Java n'est pas du tout la même qu'en C++. Ce qu'on appelle référence en Java correspond plutôt à ce qu'on appelle un pointeur en C++(avec quelque restrictions).

    Les objets sont toujours manipulés par référence(au sens java), par contre le passage d'argument ne peut se faire que par copie.

  6. #6
    Membre régulier

    Inscrit en
    novembre 2007
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : novembre 2007
    Messages : 121
    Points : 104
    Points
    104
    Par défaut
    D'accord !

    Merci à chacun pour vos éclaircissements !

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    décembre 2009
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2009
    Messages : 256
    Points : 147
    Points
    147
    Par défaut
    Alors pourquoi lorsque que j'ai le code ci-dessous , c'est bien ma liste qui est remplie et non pas sa copie dans la méthode remplissageListe ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
       JLISt myliste =  new JList();
       .........   
        remplissageListe(myliste);
          -------
     
       private void remplissageListe(JList liste )
       {
           Vector v = new Vector();
            for (int i=.....)
                v.add(......)
           liste.setListData(v);
           return  
        }

  8. #8
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : octobre 2005
    Messages : 7 431
    Points : 21 318
    Points
    21 318
    Par défaut
    Parce qu'on copie la référence et non pas la valeur.

    Les deux références (l'originale et la copie) pointent vers le même objet.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2006
    Messages : 90
    Points : 39
    Points
    39
    Par défaut
    Il faut bien faire la différence entre "liste" et "liste.quelquechose". Dans le premier cas tu manipules la référence, dans l'autre cas tu "deréférences" liste et tu manipules l'objet. Or c'est juste la référence qui est copiée.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    décembre 2009
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2009
    Messages : 256
    Points : 147
    Points
    147
    Par défaut
    D'accord avec toi, mais cela nous ramène à la question originelle :
    String est un objet également (ce n'est pas comme int, long, etc
    ..) donc dans la méthode appelée, on devrait avoir la référence vers le String et non pas une copie, alors pourquoi cet objet n'est pas modifié dans la méthode appelante ?

  11. #11
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : avril 2002
    Messages : 13 938
    Points : 23 015
    Points
    23 015
    Billets dans le blog
    1
    Par défaut
    En Java on distingue deux types de variables : les primitives et les références.

    Contrairement à d'autres langages on ne manipules pas directement des objets !!!

    Et dans les deux cas TOUT est passé par copie, ce qui signifie que toutes opérations modifiant la valeur de la variable ne seront visible que depuis la méthode où cela a été fait.

    Sauf oubli de ma part, cela comprend :
    • Pour les références, l'opérateur d'affectation ( = ).
    • Pour les primitifs, l'opérateur d'affectation ( = ) et ses dérivées ( +=, -=, *=, /=, ...) ainsi que les opérateurs d'incrémentation ( ++ et -- ).



    Par contre, lorsque tu appelles une méthodes, tu peux modifier le contenu de l'objet, mais cela n'impacte pas la référence, et donc ce changement est "visible" depuis l'extérieur.



    Pour revenir à d'autre langage, le passage par copie des références s'apparente au passage par pointeur...

    a++

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2006
    Messages : 90
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    Dans la méthode appelée, c'est la référence qui est copiée et non l'objet en entier (c'est le but des références). La référence à l'objet String dans main est à un endroit différent dans la mémoire que celle dans chgString mais toutes les deux pointent vers la même zone mémoire qui est celle de l'objet, ca me gène de dire pointe car ce ne sont pas des pointeurs mais c'est imagé.

    Et dans sa méthode, il ne modifie pas l'objet, il modifie la référence.

    Lorsque tu crées un objet, imaginons "s = new String("tata")". La machine virtuelle va alors allouer de l'espace mémoire (appelons le m1) pour stocker ton objet mais aussi pour stocker la référence (m2).

    Dans m1 tu auras, "tata". Et dans m2 tu auras une adresse qui correspond à m1.

    Dans sa fonction, il modifie m1 et pas m2.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Passage d'argument par référence (String et StringBuffer)
    Par dword2add dans le forum Débuter avec Java
    Réponses: 9
    Dernier message: 18/03/2008, 17h50
  2. [C#] passage de paramètres par référence
    Par SesechXP dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/08/2006, 13h48
  3. [String]passage de String par reference?
    Par Snivel dans le forum Langage
    Réponses: 17
    Dernier message: 02/12/2005, 17h24
  4. [EJB] Passage des paramètres par référence
    Par salome dans le forum Java EE
    Réponses: 2
    Dernier message: 05/07/2005, 12h25
  5. Réponses: 3
    Dernier message: 19/05/2005, 11h46

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