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 :

Les références : compréhension 0 !


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 79
    Par défaut Les références : compréhension 0 !
    Bonjour
    je lis partout : on manipule des référence à des objet
    Je comprends tout a fait l'exemple suivant :
    String ch1,ch2,ch
    ch1="bonjour"
    ch2="bonsoir"

    ch1=ch2 // alors copie de référence et ch1 fait référence à ch2

    Mais voila je ne comprends pas ce qu'il se passe ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    public class StringRef {
     
    	void StringRef()
    	{
     
    	}
    	public void modification(String deux)
    	{
    		deux="Ratus";
    	}
     
    	public static void main(java.lang.String[] args) {
    		String une="Mina";
    		StringRef sr=new StringRef();
    		sr.modification(une);
    		System.out.println(une);
    	}
     
    }
    Je comprends pas pourquoi une fait référence toujours à "Mina" et pas à "Ratus"

    Alors que dans l'exemple suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    class Point
    {
    	public Point(int abs,int ord)
    	{
    		x=abs;y=ord;
    	}
    	public void permute(Point a)
    	{
    		Point c=new Point(0,0);
    		c.x=a.x;
    		c.y=a.y;
    		a.x=x;
    		a.y=y;
    		x=c.x;
    		y=c.y;
    	}
    	public void affiche()
    	{
    		System.out.println("Coordonnéees: " +x + " " + y);
    	}
    	private int x,y;
    }
     
    public class Permute
    {
    	public static void main(String args[])
    	{	Point a=new Point(1,2);
    		Point b=new Point(5,6);
    		a.affiche();
    		b.affiche();
    		a.permute(b);
    		a.affiche();
    		b.affiche();
    	}
    }
    J'ai le résultat suivant :
    Coordonnéees: 1 2
    Coordonnéees: 5 6
    Coordonnéees: 5 6
    Coordonnéees: 1 2

    Donc voila je suis un peu perdu surtout pour StringRef .
    Si je pouvais avoir un peu d'explication ce serait gentil. (autre que aller voir un tuto ou un bouquin chose que je fais).

  2. #2
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public static void main(java.lang.String[] args) {
      String une="Mina";
      StringRef sr=new StringRef();
      sr.modification(une);
      System.out.println(une);
    }
    Jamais tu ne modifies la référence sur la chaîne une.

  3. #3
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par dr23fr
    ch1=ch2 // alors copie de référence et ch1 fait référence à ch2
    Je dirais plutôt qu'on copie la référence de ch2 dans ch1, et que du coup ch1 et ch2 font tous les deux références à la même instance de l'objet en mémoire.

    Citation Envoyé par dr23fr
    Je comprends pas pourquoi une fait référence toujours à "Mina" et pas à "Ratus"
    Parce que tu as deux références bien distinctes, même si elles pointent vers la même instance en mémoire.
    En effet lorsque tu passes une référence en paramètres à une méthode, tu effectues une copie de la référence. Donc ton code est l'équivalent de celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    String une = "Mina";
    String deux = une; // une et deux pointent vers la même instance ("Mina");
     
    deux = "Ratus"; // deux point désormais vers une autre instance ("Ratus"),
            // mais cela ne modifie pas la valeur de la référence 'une'.
     
    System.out.println(une); // Affiche "Mina"




    Dans le second exemple (permute()), tu modifies bien les valeurs de l'instance. Donc la référence b que tu passe en paramètre n'est pas modifié, mais par contre les attributs de l'objet qu'elle référence sont modifié et donc tu obtiens bien une modification après l'appel à la méthode.


    Ce n'est pas forcément évident au début... en particulier lorsqu'on vient du C++ où les références ne fonctionnent pas de la même manière...

    a++

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 79
    Par défaut
    Ce n'est pas forcément évident au début... en particulier lorsqu'on vient du C++ où les références ne fonctionnent pas de la même manière...
    j'ai presque envi de dire que je regrette mes pointeurs. au moins c'était clair du premier coup lol.

    Bon il me semblait avoir tout compris jusqu'a je fasse ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public class StringRef {
     
    	void StringRef()
    	{
     
    	}
    	public void toto(String b)
    	{
    		b.concat("Ratus");
    	}
    	public static void main(java.lang.String[] args) {
    		String une="mina";
    		StringRef s=new StringRef();
    		s.toto(une);
    		System.out.println(une);
    	}
    }
    Si j'ai tout compris, "b" une copie de la référence de "une". Donc quand je fais b.concat("Ratus") je modifie l'objet.
    Donc quand je fais System.out.println(une); à la fin du main je devrais voir
    "MinaRatus" ? non ?
    Or je vois seulement Mina !!! grrrrrrrrrrrr

    Merci de votre aide

    [EDIT] Bon enfait b.concat("Ratus"); me renvoie une String. Donc normal que une ne soit pas modifiée. En plus on ne peut pas modifiee les String. Si j'utilisais une StrinbBuffer ca marcherait comme prévu. non ?

    [EDIT2] Avec les StringBuffer, j'ajoute bien Ratus à l'objet. Et quand j'affiche j'ai bien "minaRatus".
    Tout va bien dans le meilleur des monde.
    Merci bien de votre aide.

    [EDIT3] euh j'ai l'impression que ca fonctionne comme les pointeurs ? au secours ai-je vraiment bien compris alors ?

  5. #5
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dr23fr
    j'ai presque envi de dire que je regrette mes pointeurs. au moins c'était clair du premier coup lol.
    Je ne pense pas que les références soit plus dur que les pointeurs (au contraire même). Par contre le passage de l'un à l'autre n'est pas évident

    Citation Envoyé par dr23fr
    [EDIT] Bon enfait b.concat("Ratus"); me renvoie une String. Donc normal que une ne soit pas modifiée. En plus on ne peut pas modifiee les String. Si j'utilisais une StrinbBuffer ca marcherait comme prévu. non ?
    En effet !
    Les String (tout comme d'autre classe d'ailleurs)sont immuables, c'est à dire qu'une fois qu'elle sont créé elle ne peuvent plus être modifié : c'est pourquoi la plupart des méhodes de String renvoit une nouvelle instance.

    Cela permet de manipuler les String avec plus de sécurité sans de soucier d'où elle vient ou à quel méthode tu la passes : tu sais qu'elle ne sera pas altéré et tu n'as donc pas besoin d'en faire une copie préventive...

    a++

  6. #6
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dr23fr
    [EDIT3] euh j'ai l'impression que ca fonctionne comme les pointeurs ? au secours ai-je vraiment bien compris alors ?
    C'est pas si loin que cela.

    En fait une référence en Java correspond à un pointeur sauf qu'il ne permet pas l'arithmétique des pointeurs (tu n'as pas le droits d'incrémenter la valeur d'une référence comme tu pourrais le faire en C/C++ par exemple pour parcourir plus rapidement un tableau). Du coups les références peuvent soit avoir la valeur null, soit pointer vers une instance valide en mémoire.
    Contrairement aux pointeurs, une référence ne peut pas pointer sur une zone mémoire non-alloué ou invalide...

    Sinon pour le reste c'est assez proche :
    • Les modifications d'un objet pointé par un pointeur/référence sera visible par tous les pointeurs/références qui pointent vers cet objet (ce qui est logique puisqu'il n'y a en tout qu'un seul objet).
    • Modifier la valeur d'un pointeur/référence ne modifiera en rien les autres pointeurs/références, même s'ils pointent sur le même objet.
    a++

    a++

  7. #7
    Membre émérite Avatar de benratti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    471
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 471
    Par défaut
    juste pour info, un post sur le même sujet.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 79
    Par défaut
    Merci et j'ai meme compris son erreur.

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

Discussions similaires

  1. pblm de compréhension sur les référence en
    Par cdm1024 dans le forum C++
    Réponses: 4
    Dernier message: 10/12/2007, 16h12
  2. Question sur les références
    Par vdumont dans le forum C++
    Réponses: 7
    Dernier message: 05/05/2006, 01h49
  3. Confusion avec les références
    Par vdumont dans le forum C++
    Réponses: 20
    Dernier message: 03/05/2006, 16h56
  4. [VB]Comment supprimer les références ?
    Par AsmCode dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 07/03/2006, 21h54
  5. Pb avec les références d'une base de données
    Par Celia1303 dans le forum Access
    Réponses: 8
    Dernier message: 01/12/2005, 15h44

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