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 :

Demande explication "référence" Java


Sujet :

Langage Java

  1. #1
    Membre régulier
    Homme Profil pro
    Etudiant
    Inscrit en
    Septembre 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2012
    Messages : 69
    Points : 86
    Points
    86
    Par défaut Demande explication "référence" Java
    Bonjour à tous,

    j'ai une petite question concernant les "références" en java. Je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private Object objClasse;
    public Classe1(Object obj1)
    {
              objClasse = obj1; // que se passe t il ici?
              objClasse.MaMethode(); // la j'appelle la méthode de qui?
    }
    J'ai vu l'exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String str1 = "bonjour"; // déclaration d'un string
    String str2 = str1; // récupération du contenu
    Tant que je ne modifie pas str2, il "pointe" sur la même zone mémoire n'est ce pas? Du coup, pour revenir à ma question, quand je fais objClasse.MaMethode(); qu'est ce qui se passe? Dans mon code j'utilise cette façon de faire pour éviter d'utiliser de multiple accesseurs et ça fonctionne. Je sais bien qu'il n'y a pas de passage par référence ou pointeur en java, mais j'ai du mal à comprendre ce qui se passe réellement...

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    La référence c'est une sorte d'identifiant unique.
    Lorsque tu écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Object obj1 = new Object();
    Object obj2 = obj1;
    Les deux variables contiennent la même valeur : obj1 et obj2 ont la même valeur, qui est une référence sur l'instance de classe Object créée dans la première ligne. Quand tu invoques une méthode, tu l'invoques sur l'instance, par le biais de la référence.

    obj2.toString() veux dire invoquer la méthode toString() sur l'instance de classe dont la référence est dans obj2. Comme c'est la même référence que dans obj1, écrire obj1.toString() invoque la méthode sur la même instance de classe.

    Dans le cas de String :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String s1 = "toto";
    String s2 = s1;
    C'est la même chose : ce qui peut être trompeur, c'est qu'on écrive s1 = "toto" qui peut donner l'impression qu'on mette une chaîne dans s1, mais on y met bien la référence d'une instance de classe String. Donc s2 = s1 ne fait que mettre cette référence dans la variable s2.

    Si ensuite tu écris s2 = "machin";, tu mets la référence d'une autre instance de classe String dans s2.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2006
    Messages : 70
    Points : 218
    Points
    218
    Par défaut
    Dans le premier cas, objClasse va pointer au même endroit que obj1. Pas de copie, se sera donc exactement le même objet.
    Du coup, à la ligne en dessous, MaMethode() peut être appelé aussi bien sur objClasse que sur obj1. Comme c'est le même objet, c'est strictement identique.

    Le cas des String est à part, car une chaine de caractères ne peut pas être modifiée.
    Du coup, pour optimiser les chaines strictement identiques, la JVM va les faire pointer au même endroit.
    Mais si on "modifie" une chaine, ce sera en réalité une nouvelle chaine qui sera crée.


    De manière générale, on peut considérer que toutes les variables de classes sont des références. Quand on les passe en argument de méthodes, il n'y a jamais de copie. C'est toujours le même objet.

    Il y a copie uniquement sur les types primitif : boolean, byte, char, short, int, float, long, double.

    Pour copier un objet, on crée un constructeur par copie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    private Classe2 objClasse;
    public Classe1(Classe1 obj1)
    {
              objClasse = new Classe2(obj1.objClasse); 
    }

  4. #4
    Membre régulier
    Homme Profil pro
    Etudiant
    Inscrit en
    Septembre 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2012
    Messages : 69
    Points : 86
    Points
    86
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    obj2.toString() veux dire invoquer la méthode toString() sur l'instance de classe dont la référence est dans obj2.
    Tout s'éclaire

    Merci pour l'explication !

  5. #5
    Membre régulier
    Homme Profil pro
    Etudiant
    Inscrit en
    Septembre 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2012
    Messages : 69
    Points : 86
    Points
    86
    Par défaut
    Citation Envoyé par Sebajuste Voir le message
    De manière générale, on peut considérer que toutes les variables de classes sont des références.
    Merci

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

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