| ||||||||
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é | ||||||||
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. | |||||||
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. | |||||||
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 | |||||||
Petit astucien | Donc pour passer une variable par référence en paramètre d'une fonction, on utilise une variable globale. | |||||||
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 | |||||||
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
| |||||||
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"); | |||||||
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é | ||||||||
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
| |||||||
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 | |||||||
|
Les bons plans du moment PC Astuces | Tous les Bons Plans | |||||||||||||||
|