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 :

passage par référence.


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 41
    Par défaut passage par référence.
    J'ai toujours appris la chose suivante au niveau de Java:
    Pour les types de base (in extenso, tout ce qui n'est pas un objet) comme int, char...
    Passage par valeur.

    Pour les objets, passage par valeur de la référence (par abus de langage, passage par référence).


    Or soit le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    String mastring = "bonjour";
    change(mastring);
    System.out.println(mastring);
     
    void change(String unestring)
    {
       unestring = "au revoir";
    }
    Ce dernier affiche bonjour.
    D'après moi, unestring et mastring référencent le même objet, donc si je modifie unestring, mastring devrait m'afficher au revoir.
    String est une exception, j'ai rien capté, y'a une subtilité?

    Merci d'avance de votre aide!

  2. #2
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Quand tu ecris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void change(String unestring)
    a l'appel de la methode change(mastring), la reference de l'objet referencé par mastring est recopie dans la variable locale a la methode qu'est le parametre unestring.

    quand tu ecris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unestring = "au revoir";
    Tu remplaces la reference dans unestring par la reference sur la chaine constante "au revoir". La variable mastring n'est en aucun cas affecte et garde la reference sur le meme objet qu'auparavant.

    Cela marche ainsi pour tout les objets java.

    Tu peux modifier un objet en utilisant par exemple un setter mais en aucun cas tu ne peux remplacer l'objet par une autre instance.

    Si je dis pas de betise il y a quelque chose la dessus dans la FAQ java.

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  3. #3
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Dans ta méthode change, quand tu fais unestring = "au revoir", tu changes juste la valeur du paramètre "unestring", qui n'est qu'une copie de mastring. Donc forcément, tu ne modifies pas mastring.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void change(UneClasseMutable objet) {
        objet.setQuelqueChose(newValeur());
    }
    Là par contre, tu modifies le contenu de l'objet passé en paramètre (mais comme il n'y a aucun setter sur la classe String (car String est immutable), tu ne peux pas modifier sa valeur).

  4. #4
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Citation Envoyé par ®om Voir le message
    Dans ta méthode change, quand tu fais unestring = "au revoir", tu changes juste la valeur du paramètre "unestring", qui n'est qu'une copie de mastring. Donc forcément, tu ne modifies pas mastring.
    Juste pour chipoter, on ne copie pas mastring (l'objet referencé par mastring) mais juste la reference contenue dans la variable, il n'y a qu'un seul objet mais plusieurs reference dessus.

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  5. #5
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par bulbo Voir le message
    Juste pour chipoter, on ne copie pas mastring (l'objet referencé par mastring) mais juste la reference contenue dans la variable
    Juste pour continuer à chipoter, c'est bien mastring qu'on copie
    En revanche, tu as raison, on ne copie pas l'objet référencé par mastring...

    (c'était juste histoire de répondre ^^)

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 41
    Par défaut
    rapide, simple, efficace.
    Merci bcp, j'ai tout compris!
    Désolé si c'était dans la FAQ, j'ai pourtant cherché avant

    [résolu!]

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 259
    Par défaut
    Sinon si on a pas d'objet modifiable, on peut toujours faire un truc comme ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    String mastring = "bonjour";
    Object[] tab = new Object[] {mastring};
    change(tab);
    mastring = tab[0];
    System.out.println(mastring);
     
    void change(Object[] tab)
    {
       tab[0] = "au revoir";
    }
    C'est un peu un cache misère mais parfois il n'y a pas d'autre solution

  8. #8
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Citation Envoyé par kpouer Voir le message
    Sinon si on a pas d'objet modifiable, on peut toujours faire un truc comme ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    String mastring = "bonjour";
    Object[] tab = new Object[] {mastring};
    change(tab);
    mastring = tab[0];
    System.out.println(mastring);
     
    void change(Object[] tab)
    {
       tab[0] = "au revoir";
    }
    C'est un peu un cache misère mais parfois il n'y a pas d'autre solution
    Ou on choisi une approche du genre de CORBA:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class GenericHolder<T>
    {
      public T value;
     
      public GenericHolder(T aValue)
      {
        value = aValue;
      }
    }
    Mais de maniere generale il est preferable d'eviter ce genre de passage de parametres. Ce n'est pas pour rien que ca n'a pas ete inclut dans le langage Java.

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  9. #9
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par eizo Voir le message
    String est une exception, j'ai rien capté, y'a une subtilité?
    Passage par valeur signifie "passage par copie de la valeur". Donc lorsque tu passes un objet tu passe une copie de la référence, et si cette référence est modifié cela n'impacte pas la référence du code appelant (la nouvelle référence n'existe que dans le corps de la méthode).

    Par contre si l'objet est modifiable alors là ca marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	void change(StringBuffer sb)
    	{
    		sb.delete(0, sb.length()); // on efface tout
    		sb.append("au revoir");
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		StringBuffer mastring = new StringBuffer("bonjour");
    		change(mastring);
    		System.out.println(mastring);
    a++

    [edit] Grillé

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

Discussions similaires

  1. Passage par référence
    Par e1lauren dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 01/09/2006, 12h59
  2. Passage par copie vs passage par référence
    Par bolhrak dans le forum C++
    Réponses: 11
    Dernier message: 20/08/2006, 23h37
  3. Réponses: 4
    Dernier message: 26/12/2005, 17h01
  4. Passage par référence
    Par difficiledetrouver1pseudo dans le forum Langage
    Réponses: 9
    Dernier message: 28/09/2005, 11h17
  5. Problème très rapide de passage par référence
    Par Noxexplorer dans le forum ASP
    Réponses: 2
    Dernier message: 23/06/2005, 10h02

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