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 Valeur


Sujet :

Langage Java

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 113
    Points : 61
    Points
    61
    Par défaut Passage par Valeur
    Bonjour...

    Comment faire pour passer un objet à une fonction sans que cette fonction ait accès à la version originale de l'objet (c'est à dire passer un objet par valeur comme en C++).

    Merci de me donner un coup de main...
    A bientot.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    Une copie? La methode clone() doit servir à cela d'habitude mais si tu créer une nouvelle classe, il va te falloir re implementer cette fonction...
    Remarque : tu peux aussi creer une autre fonction avec une autre signature ayant le meme effet...

  3. #3
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Au passage, rappelons qu'en java tous les passages de paramètres se font par valeur. Pour les objets, c'est une copie de la référence qui est passé ce qui explique que l'on puisse altérer l'objet mais pas lui affecter une nouvelle référence.

    Sinon la méthode clone() me parait être une bonne idée.


    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

  4. #4
    Membre du Club
    Inscrit en
    Juillet 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 113
    Points : 61
    Points
    61
    Par défaut
    merci de me répondre...

    En fait je suis novice en java (je me forme ...).

    J'ai lu pas mal de remarques dans d'autres discussions sur le site, concernant le passage de parametres... Je viens du C/C++. Effectivement le fonctionnement parait légerement différent...
    J'ai compris que tout les passages étaient par valeur et que pour les objets c'est la valeur de la référence qui était passée.

    J'ai du mal m'expimer dans mon message de base. Je vous explique mon cas, ce sera plus clair...
    A la base j'ai un probleme avec les vecteurs et je pense que e probleme vient du passage de mes arguments...

    MonObjet MO = new MonObjet(); // Objet avec deux propriétés Nom et prenom par exemple:
    *********************
    Vector v = new Vector();

    MO.Nom = "Nom1";
    MO.Prenom = "Prenom1";
    v.add(MO);

    MO.Nom = "Nom2";
    MO.Prenom = "Prenom2";
    v.add(MO);

    for (int i=0 ; i<v.size() ; i++) {
    MO = (MonObject)v.get(i);
    System.out.println(MO.Nom);
    System.out.println(MO.Prenom);
    }

    **********************

    Lors de l'exécution je me rettrouve avec :
    *********
    Nom2
    Prenom2
    Nom2
    Prenom2
    *********
    Je trouve ça assez déconcertant. Comme si 'add' ajoutait le pointeur sur MO au vecteur... et non pas l'objet lui-meme (d'ou ma question sur le passage par valeur!!!). La modification de MO prenant donc effet sur les deux objects ajoutés... Comment pallier ce probleme ????


  5. #5
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    Le problème vient du fait que tu initialises deux fois les attribut du meme objet 'MO', tu arais exactement le même problème en C++ car c'est la dernière affectation qui est prise en compte, à savoir nom2 et prenom2.
    Il faut donc que tu instancies deux objets MO1 et MO2 :
    v.add(MO1);
    v.add(MO2);

  6. #6
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    Une autre solution consisterait - comme on te l'a dit - à cloner l'objet lors de l'ajout dans le vecteur, mais pour cela, tu devras redéfinir la méthode clone() dans ta classe MonObjet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    MO.nom=xxxx;
    MO.prenom=xxxx;
    v.add(MO.clone());
    MO.nom=yyyy;
    MO.prenom=yyyy;
    v.add(MO.clone());
    je ne vois pas d'autre solution.
    Enfin si, une petite derniere : creer ta propre classe vecteur, et dans la méthode add() faire une copie explicite...

    Sinon, je pense qu'en java, la meilleur méthode serait quand-même de créer deux objets ( cf mon premier post ), car ce sont bien deux instances distinctes par la valeur de leurs attributs.

  7. #7
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    iohack > En fait en C++ il est courant que l'appele fasse une copie de l'objet passe en parametre, d'ou la technique employee ici.

    xc78370 > En Java on cree l'objet deux fois. On ferait meme sans reference explicite :

    v.add(new MO("nom", "prenom"));
    v.add(new MO("nom1", "prenom1"));
    Romain Guy
    Android - Mon livre - Mon blog

  8. #8
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    Citation Envoyé par Gfx
    iohack > En fait en C++ il est courant que l'appele fasse une copie de l'objet passe en parametre, d'ou la technique employee ici.
    Il me semble que les collections en C++ fonctionnent comme en java, c'est à dire par référence ( je peux me tromper, ça fait un bail que j'ai pas codé de C ).
    Sinon effectivement, les méthodes effectuent une copie des paramètres - à moins qu'un '&' ou un pointeur ne soit spécifié dans leur prototypage.

  9. #9
    Membre du Club
    Inscrit en
    Juillet 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 113
    Points : 61
    Points
    61
    Par défaut
    Merci bien à vous tous de m'avoir répondu si précisément... Je vais pouvoir avancer...

    merci..

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

Discussions similaires

  1. [PHP-JS] Javascript et PHP, passage par valeur !
    Par Cvbdev dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/04/2008, 16h24
  2. Passage par valeur
    Par NairodDorian dans le forum Fortran
    Réponses: 3
    Dernier message: 22/04/2008, 17h00
  3. Réponses: 12
    Dernier message: 26/01/2008, 20h23
  4. [Débutant] Passage par valeur d'un objet Corba
    Par peaceinpal dans le forum CORBA
    Réponses: 1
    Dernier message: 29/05/2006, 20h15
  5. Passage par valeur / passage par adresse
    Par jeje99 dans le forum C++
    Réponses: 13
    Dernier message: 16/02/2006, 10h29

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