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 :

Passage d'argument par référence (String et StringBuffer)


Sujet :

avec Java

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 53
    Par défaut Passage d'argument par référence (String et StringBuffer)
    Voilà, je programme en C et C++ et je dois passer à Java.
    Je suis en peeuut pperdu pour ce qui se passe en mémoire.

    J'ai le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    public class StringObject {
     
     
     
        void addString(String s1, String s2) {
            s1 = s1 + s2;
            // Marque 3
        }
     
        public static void main(String[] args) {
     
            StringObject ref = new StringObject();
            String mystring = "Give ";
            StringBuffer mybuffer = new StringBuffer("Give ");
            // Marque 1
     
     
            mystring = mystring + "me six ";
            mybuffer.append("me six ");
            // Marque 2
     
            ref.addString(mystring, "lines");
            mybuffer.append("lines");
            // Marque 4
     
            System.out.println(mystring);
            System.out.println(mybuffer);
        }
    }
    La sortie est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Give me six
    Give me six lines
    Si je comprend ce qui arrive à StringBuffer (occurence : mybuffer) je ne comprend pas ce qui arrive à mystring :

    Particuliérement cette ligne :
    ref.addString(mystring, "lines");

    Que représente ref ? Que fait AddString au niveau de la mémoire ? Que ce qui est accessible au niveau de marque 3.

    S'il n'ajoute pas "lines" c'est parce que la fonction ne retourne rien et que addString est call by value ?

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    La méthode addString() (et plus globalement le code que tu as posté) illustre le principe des classes et objets immuables dont fait partie la classe String .
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 53
    Par défaut
    Je ne vois pas comment la méthode addString pourrait faire qqch vu que ref n'est pas "prévu" pour acceuillir une String.

    Donc pour moi, le résultat s1 = s1 + s2; est forcément perdu lors du retour de la fonction.

    Je n'arrive pas comprendre sur quoi "ref" pointe lorsque on fait
    ref.addString(mystring, "lines");
    En java les paramètres "lines" et mystring sont copié lors de l'appel (comme en C) ?

  4. #4
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 5
    Par défaut
    Bonsoir,

    Les paramètres de la méthode ne sont pas copiés. Ils sont passés par référence, ce qui explique que la modification de ces objets dans la méthode ne se perd pas.

    Bon courage.

  5. #5
    Membre expérimenté
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Par défaut
    Citation Envoyé par fullbright Voir le message
    Les paramètres de la méthode ne sont pas copiés. Ils sont passés par référence.
    En fait, c'est faux. En Java, tout passage de paramètre se fait par valeur... Leur référence est passé par valeur, donc si à l'intérieur de ta méthode tu modifies les propriétés de ton objet, ces dernières resteront en effet modifiées lors du retour de la méthode. Par contre, si dans ta méthode tu changes la référence de ton objet (en faisant un new), rien ne sera modifié au retour de la méthode.

  6. #6
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 53
    Par défaut
    Alors je comprend pas pourquoi à la fin du programme mystring contient "give me six" et non pas "give me six lines".

    Si en java, le paramètre passé à une fonction peut ête modifié mystring devrait contenir "give me six lines" ?

    Je nage un peu...

  7. #7
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Citation Envoyé par dword2add Voir le message
    Alors je comprend pas pourquoi à la fin du programme mystring contient "give me six" et non pas "give me six lines".

    Si en java, le paramètre passé à une fonction peut ête modifié mystring devrait contenir "give me six lines" ?

    Je nage un peu...
    Parce que mystring est une instance de la classe String qui est une classe immuable. Ceci est expliqué dans le lien que j'ai indiqué dans mon post précédent.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  8. #8
    Membre expérimenté
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Par défaut
    Tes 2 paramètres sont des String, qui sont immuables (cf post plus haut). S1 n'est donc modifié qu'à l'intérieur de la méthode !

    A la limite, tu peux faire retourner à ta méthode addString le résultat de la concaténation, et l'affecter à mystring :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    String addString(String s1, String s2) {
      return s1 + s2;
    }
     
    mystring = ref.addString(mystring, "lines");

  9. #9
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    Citation Envoyé par dword2add Voir le message
    Alors je comprend pas pourquoi à la fin du programme mystring contient "give me six" et non pas "give me six lines".

    Si en java, le paramètre passé à une fonction peut ête modifié mystring devrait contenir "give me six lines" ?

    Je nage un peu...
    Coucou,

    Je vais essayer de te sortir de l'eau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    static void addString(String s1, String s2) {
            s1 = s1 + s2;
            System.out.println(s1);
        }
    public static void main(String[] args) {
       String string1="coucou";
       String string2=" ca va ?";
       addString(string1,string2);
       System.out.println(string1);
    }
    Voici la sortie qu'on obtient :
    coucou ca va ?
    coucou
    Pourquoi ?

    Simple, lorsque tu passes ton objet string1 en paramètre, une nouvelle référence s1 est crée pour référencer ton objet dans la fonction addString.

    Maintenant lorsque tu fais
    c'est équivalent à faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    s1=new StringBuffer(s1).append(s2).toString();
    Concrètement, que fais tu ? Tu assignes à la référence s1 un nouvel objet String, mais l'autre référence string1 n'est pas affectée.
    Or c'est l'effet que tu recherches.
    Il faut bien distinguer opérations sur les objets et opérations sur les références, et c'est souvent une erreur faite par les gens qui viennent du C++.

    J''espère avoir pu t'éclairer un peu

    F.

  10. #10
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 53
    Par défaut
    Je crois que j'ai compris !!!
    Merci

Discussions similaires

  1. Passage d'argument par valeur / référence
    Par ezrider dans le forum C#
    Réponses: 17
    Dernier message: 05/04/2013, 05h18
  2. Conteneurs STL : passage d'arguments par référence
    Par bolhrak dans le forum SL & STL
    Réponses: 0
    Dernier message: 26/09/2007, 20h54
  3. Passage d'arguments par référence
    Par Xavier44214 dans le forum Langage
    Réponses: 5
    Dernier message: 12/04/2007, 14h08
  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, 11h25
  5. Réponses: 3
    Dernier message: 19/05/2005, 10h46

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