> Tous les forumsAutres langages

 Passage par référence en JAVA
Statut du sujet : NON RESOLU Imprimer
 don diego
  Posté le 28/11/2005 @ 14:46  
 Petit astucien

340 Messages
Salut, Soit la fonction suivante en JAVA : void maFonction(String chaine) { ... ... } Comment fait-on pour que la variable chaine soit un passage par référence?
 
 Aller en bas de la page  
 
Publicité
 breizhbugs  Posté le 28/11/2005 à 18:20  
Astucien

4269 Messages
Salut, je vais peut etre dire une betise mais il me semble que le passage d'arguments par reference/pointeurs est le mode par defaut pour java.
 Aller en bas de la page Revenir au message précédent Revenir en haut de la page
 don diego  Posté le 28/11/2005 à 18:56  
Petit astucien

340 Messages
Justment, je ne crois pas. Car si je fais ceci : public class Test{ public static void main(String[] args){ String machaine="bonjour"; change(machaine); System.out.println("ma chaine : "+machaine); } public static void change(String s){ System.out.println("ma chaine : "+s); s="au revoir"; } } Ca affiche : ma chaine : bonjour ma chaine : bonjour Si je ne fais pas de return, alors en aucun cas je ne modifie ma variable.
 Aller en bas de la page Revenir au message précédent Revenir en haut de la page
 edon47  Posté le 28/11/2005 à 20:10  
Petit astucien

439 Messages
Salut don diego, Ton problème vient du fait que tes 2 variables ne sont que locales étant donné quelles font toutes deux partie d'une méthode (machaine dans "main()" et s dans "change()"); donc elles ne se connaissent pas. Pour y remédier, il faut que "machaine" soit déclarée globale à la classe "Test". De plus si tu veux l'utiliser dans "main", il te faut la déclarer "static" car main est "static". Voici un petit exemple tiré de ton code. [code]public class Test { static String machaine="bonjour"; public static void main(String[] args) { System.out.println("ma chaine : "+ machaine); change("Au revoir"); System.out.println("ma chaine: " + machaine); } public static void change(String s){ machaine = s; //System.out.println("ma chaine : " + s); } }[/code] Résultat: ma chaine : bonjour ma chaine: Au revoir Quand tu appelles change(), tu dois lui passer une chaine pour changer la variable 'machaine': change("Salut les mecs") ou change ("Bonsoir"). Enfin j'espère t'avoir mis sur la piste,sinon reviens avec d'autres questions. Bonne chance.

Modifié par edon47 le 28/11/2005 20:18
 Aller en bas de la page Revenir au message précédent Revenir en haut de la page
 don diego  Posté le 29/11/2005 à 16:38  
Petit astucien

340 Messages
Donc pour passer une variable par référence en paramètre d'une fonction, on utilise une variable globale.
 Aller en bas de la page Revenir au message précédent Revenir en haut de la page
 edon47  Posté le 29/11/2005 à 17:12  
Petit astucien

439 Messages
Exact, car si la variable est locale à la fonction, elle est invisible en dehors de celle-ci. Tu l'as déclarée dans main() alors tu ne peux la passer en paramètre à une fonction extérieure à main(). La méthode change() ne peut lire que ce qui est déclaré dans la classe Test.

Modifié par edon47 le 29/11/2005 17:20
 Aller en bas de la page Revenir au message précédent Revenir en haut de la page
 
Publicité
 jfloviou  Posté le 07/08/2006 à 19:23  
Petit astucien

3 Messages
Bonjour, Les reponses de ce thread sont fausses: 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 ) Dans ton cas don Diego, tu réassignes la référence lorsque tu fais s="au revoir" .... La réference ne pointe alors plus vers le même espace memoire. public class Test{ public static void main(String[] args){ StringBuffer machaine="bonjour"; change(machaine); System.out.println("ma chaine : "+machaine.toString()); } public static void change(StringBuffer s){ System.out.println("ma chaine : "+s.toString()); s.append("au revoir"); } } affiche ma chaine : bonjour ma chaine : au revoir JF
 Aller en bas de la page Revenir au message précédent Revenir en haut de la page
 don diego  Posté le 09/08/2006 à 11:13  
Petit astucien

340 Messages
Salut jfloviou, Merci d'avoir répondu si tôt (lol). J'ai testé ton code pour être sûr et cela affiche : ma chaine : bonjour ma chaine : bonjourau revoir La variable 'machaine' a bien été modifiée. C'est donc bien un passage par référence. Et cela ne marche que pour les objets. Sinon, juste pour te dire que 'machaine' ne peut pas s'initialiser comme tu la écris mais plutôt : StringBuffer machaine = new StringBuffer("bonjour");
 Aller en bas de la page Revenir au message précédent Revenir en haut de la page
 jfloviou  Posté le 09/08/2006 à 12:16  
Petit astucien

3 Messages
Ouaip désolé, je passe ar hazard sur le message et je me disais que ce serait dommage que les suivants partent sur une fausse piste suite aux precedentes reponses... Tu as raison pour le StringBuffer qui s'initialise comme tu le signales. Dans ton cas, le probleme vient de l'objet String qui est assez mal fait en java: pas de methode de modif, d'où tes problemes. De facon general il faut privilegier les stingBuffer pour bcp de manipu sur les chaines. JF
 Aller en bas de la page Revenir au message précédent Revenir en haut de la page
 nafrouta  Posté le 20/08/2006 à 17:55  
Petite astucienne

34 Messages
jfloviou t as bien di ke : Les reponses de ce thread sont fausses: 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 ) et c'est tres juste ! mai le probleme de don diego ne reside pa dans la reference mai c'est juste une petite erreur de logique en effet il aurai du faire comme ça : public class Test{ public static void main(String[] args){ String machaine="bonjour"; change(machaine); System.out.println("ma chaine : "+machaine); } public static void change(String s){ s="au revoir"; System.out.println("ma chaine : "+s); } } parce que dans le cas ou il affecte "au revoir" a s apres avoir afficher le message , bien sur que s va s afficher avec le contenu de ma chaine puisqu il l a passe comme parametre de la fonciton !!!! donc il fau juste mettre le s="au revoir" avant le system.out.println
 Aller en bas de la page Revenir au message précédent Revenir en haut de la page
 jfloviou  Posté le 29/08/2006 à 01:05  
Petit astucien

3 Messages
Nafrouta, Il ne s'agit as d'un problème de logique puisque ce n'est pas le system.out.println de la fonction change qui doit sortir "au revoir" mais celui du main ... Ton code ne marche donc pas lui non plus.... Il s'agit bien d'un "probleme" de l'objet java String (d'ou la creation du StringBuffer): s="au revoir"; est une assignation batarde: CELA RECREE UNE REFERENCE ET UNE ZONE MEMOIRE ASSOCIEE! Autrement dit: [code]s="au revoir"; [/code] est strictement equivalent à [code]char data[] = {'a','u',' ','r','e','v','o','i','r'}; s = new String(data);[/code] Voir la javadoc concernant l'objet String qui n'est plus modifiable apres sa construction => donc le passage de cette objet par reference ne sert à rien! [url]http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html[/url] Cordialement JF
 Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Haut de la page 

Inscrivez-vous au Forum PC Astuces !
  • Posez vos questions
  • Résolvez vos problèmes
  • Aidez les autres
  • Participez et créez vos discussions
  • Dialoguez en privé avec d'autres membres
  • Suivez vos sujets préférés
  • Affichez les signatures des membres
  • Suivez les mises à jour des logiciels proposés sur PC Astuces
  • Uploadez et partagez vos images
TOUT EST GRATUIT !

>> Je crée mon compte <<


Sur PC Astuces


 > Tous les forumsAutres langages

 
Forum PC Astuces© 1997-2014 WebastucesAller en haut de la page