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

Java Discussion :

En Java, c'est bien un passage par référence non ?


Sujet :

Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 155
    Points : 45
    Points
    45
    Par défaut En Java, c'est bien un passage par référence non ?
    bonjour à tous,

    quelque chose m'échappe je crois, voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Integer integer = null;
    Connection connexion = null;
    connexionSGBD(connexion, "/data/conf/connexionsJava.conf", integer);
    à la fin, connexion redevient null et integer redevient null aussi... alors que dans le fonction connexionSGBD, ils avaient pris une valeur non nulle

    quelqu'un a-t'il une idée svp ?

    merci

  2. #2
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Non : Java utilise uniquement un passage par copie...

    • Par copie de valeur pour les types primitifs
    • Par copie de la référence pour les "objets" (puisqu'on manipule une référence et non pas directement un objet)


    Donc ce comportement est tout à fait normal. (si besoin il y a plusieurs sujets sur le forum où tout cela est plus détaillé).

    a++

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 155
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    Non : Java utilise uniquement un passage par copie...

    • Par copie de valeur pour les types primitifs
    • Par copie de la référence pour les "objets" (puisqu'on manipule une référence et non pas directement un objet)


    Donc ce comportement est tout à fait normal. (si besoin il y a plusieurs sujets sur le forum où tout cela est plus détaillé).

    a++
    je suis pas sûre de voir la différence entre un passage par référence et un passage par copie de référence :-/

  4. #4
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Ben en fait la différence c'est quand tu définis un objet dans une fonction, à la fin de ta fonction ton objet est perdu.

    Une copie de référence car en java tout est pointeur en gros tu manipules jamais la donnée d'où la nuance.

  5. #5
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par _LittleFlea_ Voir le message
    je suis pas sûre de voir la différence entre un passage par référence et un passage par copie de référence :-/
    Lorsque tu passes par références, tu manipules exactement le même espace mémoire entre la méthode appelante et la méthode appelée.

    Lorsque tu effectues un passage par copie, tu recopies la valeur des paramètres lors de l'appel de méthode, qui travaillera donc sur une espace mémoire différent.

    En clair lors d'un passage d'une référence par copie, tu manipule une nouvelle référence qui pointe vers le même objet. Si tu modifies l'objet cela impactera bien sûr le même objet que la référence d'origine. Par contre elle ne sera pas impacté par la modification de la référence elle même...


    En fait le passage par copie de la référence de Java est proche du copie par adresse du C/C++...

    C'est comme lorsque tu manipules deux références vers un même objet : tu peux changer la valeur de l'objet, mais pas associer un nouvel objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    StringBuffer buf1 = new StringBuffer("hello");
    StringBuffer buf2 = buf1; // copie de la référence et non pas de l'objet.
     
    buf2.append(" world !"); // modif de l'objet pointé par les deux référence
     
    // buf1 & buf2 pointent vers le même objet
     
    buf2 = new StringBuffer();
     
    // buf1 & buf2 point désormais vers des objets différents
    a++

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Citation Envoyé par _LittleFlea_ Voir le message
    je suis pas sûre de voir la différence entre un passage par référence et un passage par copie de référence :-/
    C'est parce qu'un passage par "copie de référence" ça ne veut rien dire. C'est passage par copie ou passage par référence, l'un ou l'autre.

    Or, en Java, les paramètres sont passés par copie.

    Tu confonds peut-être avec le fait qu'en Java, les objets sont toujours des références d'objet. Oui. Mais ces références sont quand même passées par copie.
    On ne peut pas modifier la référence, on peut modifier l'objet qui est référencé.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 155
    Points : 45
    Points
    45
    Par défaut
    Merci pour vos réponses.

    Donc finalement, comment faire pour modifier mes objets ?

    merci

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Vu ton exemple, tu n'as pas besoin de les modifier, tu as besoin de les créer. Ils sont à null, donc ils n'existent pas.

    Tu devrais créer une classe simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class ConnectionInfo {
      public int integer;
      public Connection connection;
      public ConnectionInfo(int integer, Connection connection) {
        this.integer = integer;
        this.connection = connection;
      }
    }
    Ton EDI peut générer ça rapidement.

    Ensuite, tu t'en sers de sorte de faire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ConnectionInfo info = connexionSGBD("/data/conf/connexionsJava.conf");
    int integer = info.integer;
    Connection connection = info.connection;
    Voilà comment ça marche. (Oui, c'est un peu lourd. Il manque une syntaxe pratique pour faire ça en Java.)

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 165
    Points : 116
    Points
    116
    Par défaut
    Bonjour,

    je déterre ce topic car je n'ai pas tout pigé et j'ai un pb similaire.

    J'ai bien compris ceci :

    Le passage des paramètres en java se fait bien par référence SAUF pour les types primaires (ceux qui ne sont pas des objets: boolean char byte short int long float double )
    Maintenant, ok ce n'est pas un passage par référence mais par "copie de référence", au final cela change quoi pour éditer notre paramètre ?

    Je m'explique.

    Imaginons une méthode qui instancie une nouvelle Map :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<Integer,String> toto = new HashMap<Integer,String>();
    On passe notre map dans une méthode qui renvoie déjà une valeur de retour.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    boolean isExecuted = maMethode(monParam1, toto);
    ...
    et imaginons que notre méthode "renseigne" la map.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    private boolean isExecuted(String monParam1, Map<Integer,String> bob){
      ...
      bob.put(key,value);
      ...
      return true;
    Comment se fait il que notre map ne semble pas être renseignée dans méthode principale ?
    Si je pige bien on travaille sur la copie de la référence, donc finalement l'insertion d'élément devrait se faire sur le même objet.....

    plz Help ! thanks


    [edit]
    - Le contenu d'une variable de type objet (une référence mémoire) ne peut pas être modifié par une méthode pour qu'elle (la variable) fasse référence à un autre objet mais le contenu de l'emplacement mémoire référencé peut être modifié.
    Ne sommes nous pas dans le cas de la modification du contenu d'un emplacement mémoire référencé ?

  10. #10
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Avec ton exemple, ta map sera bien alimentée ... Sauf si la référence a été changée dans la méthode. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    private boolean isExecuted(String monParam1, Map<Integer,String> bob){
      ...
      bob = new HashMap<Integer,String>;
      ...
      bob.put(key,value);
      ...
      return true;
    }

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    il suffit de retenir ces deux principes de java, tout en découle:

    -> Tous les passages de paramètre de méthodes se font par copie, les variables d'origine ne sont donc jamais affectées
    -> Toutes les variable java sont soit des types primitifs, soit des références.

    Il faut donc bien, dans ce genre de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Map m = new HashMap()
    doSomething(m);
    faire la distinction entre "m", qui est une référence vers une Map, et qui ne sera jamais modifiée par l'appel, et la HashMap pointée par cette référence, qui pourra être manipulée par la méthode.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 165
    Points : 116
    Points
    116
    Par défaut
    ok merci

Discussions similaires

  1. Gui avec Java,c'est Bien ?
    Par deltaweb dans le forum Général Java
    Réponses: 4
    Dernier message: 24/12/2013, 15h52
  2. Passage par référence en java
    Par psycho_xn dans le forum Débuter avec Java
    Réponses: 11
    Dernier message: 10/12/2009, 16h26
  3. Réponses: 4
    Dernier message: 26/12/2005, 18h01
  4. Passage par référence
    Par difficiledetrouver1pseudo dans le forum Langage
    Réponses: 9
    Dernier message: 28/09/2005, 12h17
  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, 11h02

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