× Aidez la recherche contre le COVID-19 avec votre ordi ! Rejoignez l'équipe PC Astuces Folding@home
 > Tous les forums > Forum Autres langages
 Passage par référence en JAVA
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
don diego
  Posté le 28/11/2005 @ 14:46 
Aller en bas de la page 
Petit astucien
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?
Publicité
breizhbugs
 Posté le 28/11/2005 à 18:20 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien
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.
don diego
 Posté le 28/11/2005 à 18:56 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien
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.
edon47
 Posté le 28/11/2005 à 20:10 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien
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
don diego
 Posté le 29/11/2005 à 16:38 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien
Donc pour passer une variable par référence en paramètre d'une fonction, on utilise une variable globale.
edon47
 Posté le 29/11/2005 à 17:12 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien
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
jfloviou
 Posté le 07/08/2006 à 19:23 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Nouvel astucien
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
don diego
 Posté le 09/08/2006 à 11:13 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien
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");
jfloviou
 Posté le 09/08/2006 à 12:16 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Nouvel astucien
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
Publicité
nafrouta
 Posté le 20/08/2006 à 17:55 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petite astucienne
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
jfloviou
 Posté le 29/08/2006 à 01:05 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Nouvel astucien
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
Page : [1] 
Page 1 sur 1

Vous devez être connecté pour poster des messages. Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !


Les bons plans du moment PC Astuces

Tous les Bons Plans
-70%70% de réduction sur l'abonnement de 3 ans à NordVPN
Valable jusqu'au 18 Août

NordVPN fait jusqu'à ce soir une promotion sur son abonnement 3 ans qui passe à 111,82 € au lieu de 382,88 € soit une réduction de 70 %. L'abonnement vous reviendra ainsi à 3,11 € / mois. Ce VPN sérieux et rapide vous permettra de surfer anonymement (pas de log conservé) mais également de chiffrer votre connexion en déplacement ou bien d'accéder aux contenus réservés aux internaux d'autres pays (pour les matchs de football restransmis sur les sites web de certaines tv étrangeres par exemple). vous pourrez choisir parmi 5100 serveurs répartis dans 59 pays. 6 appareils peuvent utiliser simultanément le compte. 

 


> Voir l'offre
29,99 €Souris gamer Logitech MX518 à 29,99 €
Valable jusqu'au 12 Août

Boulanger solde la nouvelle version Legendary de la souris Logitech MX518 qui passe à 29,99 € alors qu'on la trouve ailleurs à 59,99 €. Cette très bonne souris dédiée aux joueurs dispose d'un capteur optique très précis Hero 16000 DPI, 8 boutons programmables et une mémoire permettant de sauvegardera 5 profils d'utilisation différents. 


> Voir l'offre
51,99 €SSD Silicon Power A55 512 Go à 51,99 €
Valable jusqu'au 14 Août

Amazon fait une promotion sur le SSD Silicon Power A55 512 Go qui passe à 51,99 € livré gratuitement. Ce SSD à mémoire TLC possède un cache SLC et offre des taux de transfert de 550 Mo/s en lecture et 450 Mo/s en écriture. 


> Voir l'offre

Sujets relatifs
C Problème pointeur et passage en référence.
Classer une arraylist (java)
Ameliorer le Main "Java" avec les fonctions & procédures
Rafraichir un tableau en java
Calcul du jour d'après - - > java
encore java
Filter un fichier CSV en Java
java error
java 9
Impossible d'installer la maj Java 7 update 15
Plus de sujets relatifs à Passage par référence en JAVA
 > Tous les forums > Forum Autres langages