p
u
b
l
i
c
i
t
é
publicité
  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 : 17
    Points
    17

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

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

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

    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 546
    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 546
    Points : 22 049
    Points
    22 049

    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

    Inscrit en
    septembre 2004
    Messages
    10 441
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 10 441
    Points : 17 461
    Points
    17 461

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

    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
    10 441
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 10 441
    Points : 17 461
    Points
    17 461

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

    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 Expert
    Inscrit en
    août 2009
    Messages
    1 054
    Détails du profil
    Informations forums :
    Inscription : août 2009
    Messages : 1 054
    Points : 1 765
    Points
    1 765

    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 Confirmé Sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    22 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

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

    Informations forums :
    Inscription : avril 2007
    Messages : 22 914
    Points : 43 538
    Points
    43 538

    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.
    "Tchize is always good. Tchize is just milk’s attempt at being immortal"
    faq java, cours java, javadoc. Pensez à et

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

    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, 14h52
  2. Passage par référence en java
    Par psycho_xn dans le forum Débuter
    Réponses: 11
    Dernier message: 10/12/2009, 15h26
  3. Réponses: 4
    Dernier message: 26/12/2005, 17h01
  4. Passage par référence
    Par difficiledetrouver1pseudo dans le forum Langage
    Réponses: 9
    Dernier message: 28/09/2005, 11h17
  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, 10h02

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