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

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    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 averti
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Points : 318
    Points
    318
    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 actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    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
    Points : 653
    Points
    653
    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 actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

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

  6. #6
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Points : 318
    Points
    318
    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 actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    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
    Points : 653
    Points
    653
    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.

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Voilà qui me rassure à tout épreuve, merci kei2906 !
    Je suis entièrement d'accord avec toi sur tous les points que tu énonces, j'avais juste besoin d'un petit rappel sur le passage des paramètres en JAVA.

    A+

  11. #11
    Invité
    Invité(e)
    Par défaut
    J'ai fait des recherches sur ces objet dits "immuables".

    En fait, ça ne correspond pas à une fonctionnalité du langage Java. Les objets tels que String sont dits immuables simplement parce que tous les attributs sont privés et qu'aucune méthode ne permet d'en modifier le contenu (donc pas de setters ou autres) !

    La seule manière de modifier le contenu d'un objet immuable est d'en créer un nouveau (mais par là-même, on ne modifie pas l'objet initial). C'est pour cela que ça donne l'illusion d'être un passage par valeur alors qu'on a bien un passage par référence comme pour tous les objets.

    Donc ce que je dit plus haut dans mon post au sujet des objets immuables est faux.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
          public static void main(String[] args) {
    		String sMain = "hello"; 
    		change(sMain); // On passe bien la référence de sMain et pas
                                  // la valeur
    		System.out.println(sMain );
    	}
     
    	public static void change(String sChange ) {
    		sChange = "coucou"; // Cette ligne crée un nouvel objet String
                                       // et donc ne modifie pas l'objet sMain
    	}
     
    // L'exécution de ce code affichera "hello"
    Le concept d'immuabilité est donc une manière de concevoir un objet et non une fonctionnalité du langage.

+ 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