Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 12 sur 12
  1. #1
    Futur 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 : 15
    Points
    15

    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 :
    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 Confirmé Sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    avril 2002
    Messages
    13 136
    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 136
    Points : 19 028
    Points
    19 028

    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
    Futur 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 : 15
    Points
    15

    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
    Candidat au titre de Membre du Club
    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 : 10
    Points
    10

    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 Confirmé Sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    avril 2002
    Messages
    13 136
    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 136
    Points : 19 028
    Points
    19 028

    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 :
    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

    Inscrit en
    septembre 2004
    Messages
    9 476
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 9 476
    Points : 14 302
    Points
    14 302

    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
    Futur 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 : 15
    Points
    15

    Par défaut

    Merci pour vos réponses.

    Donc finalement, comment faire pour modifier mes objets ?

    merci

  8. #8
    Modérateur

    Inscrit en
    septembre 2004
    Messages
    9 476
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 9 476
    Points : 14 302
    Points
    14 302

    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 :
    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 :
    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 du Club
    Inscrit en
    août 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : août 2007
    Messages : 165
    Points : 69
    Points
    69

    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 :
    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 :
    1
    2
    3
    4
     
    ...
    boolean isExecuted = maMethode(monParam1, toto);
    ...
    et imaginons que notre méthode "renseigne" la map.
    Code :
    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 Expert
    Inscrit en
    août 2009
    Messages
    1 041
    Détails du profil
    Informations forums :
    Inscription : août 2009
    Messages : 1 041
    Points : 1 601
    Points
    1 601

    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 :
    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 Confirmé Sénior
    Avatar de tchize_
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    avril 2007
    Messages
    21 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Service public

    Informations forums :
    Inscription : avril 2007
    Messages : 21 157
    Points : 34 798
    Points
    34 798

    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 :
    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.
    Tchize (Чиз) faq java, cours java, javadoc. Pensez à et
    Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.

  12. #12
    Membre du Club
    Inscrit en
    août 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : août 2007
    Messages : 165
    Points : 69
    Points
    69

    Par défaut

    ok merci

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •