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 de paramètres


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut Passage de paramètres
    Bonjour, j'ai un petit soucis de compréhension sur le passage de paramètres en Java. Ayant fait du C, C++ et C#, j'ai du mal à comprendre comment l'objet est passé en paramètre. Ce que j'ai compris, c'est que c'est un passage par référence, c'est à dire que l'objet sera modifié quoi qu'il arrive, mais si l'on souhaite passer un objet sans le modifier, juste pour faire une copie, comment fait-on ?
    Merci de vos réponses !

  2. #2
    Membre expérimenté
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Par défaut
    Salut,

    En Java, tout passage en paramètre se fait par valeur. Lorsque tu passes un objet en paramètre, tu passes en fait la valeur de sa référence. Ainsi, si dans la méthode appelée tu modifies les propriétés de cet objet, ces propriétés seront bel & bien modifiées lors de la sortie de la méthode (puisque tu attaques la référence).

    Or, toujours dans cette méthode appelée, si à la place tu modifies la référence de l'objet (en faisant un "new"), alors en retour de méthode ton objet primaire n'aura pas été modifié.

    Ensuite, afin de ne pas voir les propriétés modifiées, il faut lors de l'appel faire un clone de ton objet, en appelant la méthode "clone". S'il s'agit d'une classe à toi, il te faudra alors implémenter cette méthode clone.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    Ok, mais dans ce cas, si l'objet est toujours modifié, le passage se fait par référence et non par valeur. Je sais, notamment qu'en C++ par exemple, le passage par valeur ne modifie pas l'objet car il fait une copie de celui-ci, c'est bel et bien le passage par référence qui modifie l'objet par la suite.
    Merci pour ta réponse.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Je ne suis pas tout à fait d'accord. Le passage des paramètres se fait par valeur lorsqu'il s'agit d'une primitive, mais il se fait bien par référence lorsqu'il s'agit d'un objet.

    Notons qu'il existe une catégorie d'objet que sont les objets immuables dont le passage en paramètre équivaut à un passage par valeur dans la mesure où ces objets sont immuables. C'est le cas par exemple des chaînes de caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void methode(String s) {
    	s = s + s; //ici la chaine s n'est pas modifiée, elle est réaffectée localement
    }
    Sinon, pour le reste, comme l'a écrit DevTeam, il faut passer un clone en paramètre, ce qui t'oblige à implémenter correctement la méthode Object.clone().

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    Ok, j'ai bien compris maintenant.
    Merci à vous deux !

  6. #6
    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 verbose Voir le message
    Je ne suis pas tout à fait d'accord. Le passage des paramètres se fait par valeur lorsqu'il s'agit d'une primitive, mais il se fait bien par référence lorsqu'il s'agit d'un objet.
    Un petit test :
    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
     
    public class MaClasse {
      public String tmp;
     
      public MaClasse(String val) {
        tmp = val;
      }
    }
     
    public class Test {
      public static void main(String[] args) {
        MaClasse c = new MaClasse("hello");
        change(c);
        System.out.println(c.tmp);
      }
     
      public static void change(MaClasse test) {
        test = new MaClasse("coucou");
      }
    }
    En sortie de "change", on affiche "hello", et non "coucou". L'objet passé en paramètre n'a pas été modifié : c'est bel & bien la valeur de sa référence qui a été passée en paramètre (en tout cas, c'est comme ça que je le comprends... )

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    J'avais jamais vu ça avant ? Pourquoi refaire un new sur un objet déjà créé ??

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Citation Envoyé par DevTeam_ Voir le message
    En sortie de "change", on affiche "hello", et non "coucou". L'objet passé en paramètre n'a pas été modifié : c'est bel & bien la valeur de sa référence qui a été passée en paramètre (en tout cas, c'est comme ça que je le comprends... )
    La valeur de sa référence ? késako ?

    Il est exacte qu'il ne s'agit pas d'une passage par référence comme le montre ton exemple , mais plutôt un passage par pointeur, bien que Java ne supporte l'arithmétique des pointeurs.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Ya un problème de vocabulaire ici je crois :
    Pour moi, quand on dit "passage de paramètre par valeur", cela veut dire que l'on copie la zone mémoire contenant le paramètre, qu'on met ça dans la pile et que si la fonction/méthode modifie ce paramètre, l'objet initial ne sera pas modifié, lui.

    "Passage par référence" signifie que l'on donne en paramètre de la méthode/fonction une référence (référence = pointeur !) vers l'objet et que si la fonction modifie l'objet, ces changements seront aussi visibles dans le code qui a appelé la fonction.

    En java :
    • les types primitifs (int, double, float, etc...) sont passés par valeur.
    • les objets sont passés par référence (contrairement au C++, on ne peut pas passer d'objet par valeur).
    • certains objet dit immuables, comme les String sont passés par valeur.


    On entend souvent dire que Java ne connait pas les pointeurs. C'est relativement faux. On pourrait même dire que Java ne connaît QUE ça (en les appelant "références"), mais qu'au niveau du codage il essaie de s'abstraire de la notion de pointeur qui est source de nombreuses erreurs.

    Je pense que le terme "valeur de sa référence" de DevTeam, s'il n'est pas rigoureusement incorrect, porte à confusion.

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

Discussions similaires

  1. [Forms]Passage de paramètre entre Forms et Reports
    Par jack554 dans le forum Reports
    Réponses: 4
    Dernier message: 30/03/2004, 13h58
  2. probleme lors du passage de paramètre
    Par maxmj dans le forum ASP
    Réponses: 4
    Dernier message: 18/11/2003, 00h15
  3. [XSL] Passage de paramètres à un template
    Par pantin dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 27/06/2003, 13h28
  4. passage de paramètres
    Par pram dans le forum XMLRAD
    Réponses: 5
    Dernier message: 18/02/2003, 17h28
  5. passage en paramètre d'un array dynamique 2D
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 27/11/2002, 19h47

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