probleme avec un passage d'argument... [java] - Java - Programmation
Marsh Posté le 02-12-2003 à 16:10:49
quand tu fais
chemPart = bl;
c'est juste la variable locale chemPart que tu modifies, pas la variable qui a été utilisée lors de l'appel de la méthode, ni l'objet que ces deux variables pointent ...
Marsh Posté le 02-12-2003 à 16:15:57
comment puis-je faire pour modifier la variable que je passe en argument alors ??
Marsh Posté le 02-12-2003 à 16:19:12
mais en fait dans la suite de ma methode, dans le "else" je fais
Code :
|
Et la je me rends compte que chemSousPart est vide, alors qu'il contenait qqchose dans la recursive precedante !
Marsh Posté le 02-12-2003 à 16:28:57
babthefox2002 a écrit : mais en fait dans la suite de ma methode, dans le "else" je fais
|
bha oui ...
exemple :
Code :
|
Code :
|
parce que dans le méthode changePersonne, tu créés un nouvel objet que tu attache à la variable locale p. Mais la variable p1, elle n'est pas modifiée.
T'as 4 solutions :
1) soit tu modifies l'objet (an appelant des méthodes dessus), 2) soit ta méthode devient une fonction et elle retourne la valeur de l'objet que tu aura créé dedans et ce sera à toi d'affecter cet objet à ta variable.
3) soit tu englobes ton objet dans un autre objet qui te servira de conteneur.
4) tu revois ton algo parce qu'il est bancale
tu connais les pointeurs ou pas ? ce sera peut être plus simple de t'expliquer comme ca ...
Marsh Posté le 02-12-2003 à 16:41:33
oui je connais les pointeurs, mais normalement je croyais que quand tu passais un objet 'toto' en parametre d'une methode personne(), le parametre correspondant a 'toto' dans personne() pointait toujours sur la meme chose que 'toto', sauf dans le cas ou dans personne on fait un truc genre :
objet tata = (le parametre correspondant a 'toto')
ou la 'tata' est une variable locale de personne().
Marsh Posté le 02-12-2003 à 18:53:27
bon ....
si tu connais les pointeurs, on va attaquer par ce bout là.
Quand tu fais
Code :
|
Ca créé un objet Personne en mémoire. L'adresse mémoire de cet objet est stocké dans la variable locale p.
Donc p ne contient que l'adresse mémoire, rien d'autre. C'est un pointeur vers l'objet.
Quand tu appelles une méthode en java et que tu passes en arguments des objets, c'est le pointeur que tu passes : la veleur de la variable, c'est à dire l'adresse mémoire. C'est un passage par valeur !
Donc, une fois dans ta méhode, la variable (le paramêtre) est locale. C'est un nouvelle variable qui contient la même valeur (l'adresse mémoire de l'objet) que la variable qui a été utilisé dans l'appel de la méthode : c'est uen copie de la valeur de la variable.
Donc si dans ta méthode tu fais
Code :
|
la variable locale va prendre la valeur de l'adresse mémoire du nouvel objet. Mais c'est uniquement la variable locale qui est affectée, pas la variable qui avait été utilisé pour faire l'apelle de la méthode : elle, elle garde sa valeur originale.
capiché ?
Marsh Posté le 02-12-2003 à 18:59:41
Ok merci, je vais corriger mon erreur...
Je ne savais pas que ca changeait de valeur que localement... Merci pour l'explication.
Marsh Posté le 02-12-2003 à 23:55:54
euh
benou je voudrais pas lancer un débat à cette heure-ci, mais j'pense que t'as tout faux...
plus de détails dans qques minutes.
(faire du java sous vi, j'ai connu plus excitant)
Marsh Posté le 02-12-2003 à 23:59:04
voila.
Code :
|
Marsh Posté le 03-12-2003 à 00:00:57
on passe donc bien par réference à une methode, et la reference n'est pas "localisée" à la méthode appelée.
sauf pour les types primitifs (forcément) et les immutables (ça c taiche qui l'a dit; ça me parait logique mais bon, je répond de rien)
Marsh Posté le 03-12-2003 à 00:01:39
the real moins moins a écrit : euh |
Marsh Posté le 03-12-2003 à 00:05:44
ReplyMarsh Posté le 03-12-2003 à 00:08:21
en quoi ca va à l'encontre de ce que j'ai dit ??
the real moins moins a écrit : on passe donc bien par réference à une methode. |
bien sûr qu'on passe un objet par référence. C'est pas comme en C++ où une copie de l'objet est faite à chaque appel de méthode ! Mais si on parle du pointeur (puisqu'une référence est un pointeur), c'est la valeur du pointeur (adresse méméoire) qui est passée. et ce passage est fait par copie !
the real moins moins a écrit : sauf pour les types primitifs (forcément) et les immutables (ça c taiche qui l'a dit; ça me parait logique mais bon, je répond de rien) |
pour les types primitifs, c'est comme pour les objets ! c'est toujours du passage par copie de la valeur de la variable. Si c'est un type primitif, la valeur de la variable est le type lui même => c'est une simple copie. Quand c'est une référence c'est pareil : c'est une copie de cette référénce qui devient une 2e référence vers le même objet, mais c'est pas en écrasant la valeur de cette référence (en faisant une bête affectation) que tu vas modifier la 1ere référence...
quand au fait d'immaginer que le passage des paramêtres se fait différement si c'est un type immuable
Comment il peut le savoir java quand c'est un type immuable ??
franchement, ca me déçoit que tu puisses penser que je me trompe sur un truc aussi basique que ca
Marsh Posté le 03-12-2003 à 00:09:09
the real moins moins a écrit : et la reference n'est pas "localisée" à la méthode appelée. |
bien sûr qu'elle l'est !
en quoi ton exemple montre qu'elle ne l'est pas ?
Marsh Posté le 03-12-2003 à 00:13:46
démonstrattion :
Code :
|
Citation : t1 |
je suis étonné que tu puisses te faireavoir sur ce genre de trucs
Ou bien on s'est mal compris ?
Marsh Posté le 03-12-2003 à 00:18:14
benou a écrit : |
Euh baaaaaa... fais un test tout con, genre une méthode qui prend une String en paramètre, qui la modifie et qui l'affiche. Tiens, de tête et sans compiler :
Code :
|
T'auras :
Citation : |
joulieMethode a modifié localement la variable et pis c'est tout. En revanche, fais pareil avec une ArrayList (en lui rajoutant des éléments, par exemple) et ton ArrayList initiale sera bien modifiée.
Marsh Posté le 03-12-2003 à 00:19:42
benou a écrit : démonstrattion : |
Ca doit être ça, alors
Passke d'après ce que j'en ai lu, tu semblais dire que le passage de paramètre en Java c'était du passage par valeur et non par référence
Marsh Posté le 03-12-2003 à 00:22:38
Taiche a écrit : |
la valeur du pointeur !!
Marsh Posté le 03-12-2003 à 00:25:13
Taiche a écrit : joulieMethode a modifié localement la variable et pis c'est tout. En revanche, fais pareil avec une ArrayList (en lui rajoutant des éléments, par exemple) et ton ArrayList initiale sera bien modifiée. |
mais tu confonds tout !!!
quand tu fais un += d'une string et quand tu fais un add dans une arraylist ca a rien à voir !!!
Un += d'une String tu créée un nouvel objet String que tu affectes à la référence locale => ca n'a aucun effet en dehors de la méthode.
Un add d'une arraylist c'est un appel qui va modifier l'objet pointé par la référence => ca a un effet en dehors de la méthode
qu'est ce que vous me faites là ????
Marsh Posté le 03-12-2003 à 00:27:11
ReplyMarsh Posté le 03-12-2003 à 00:27:33
ReplyMarsh Posté le 03-12-2003 à 00:27:53
bah oui d'autant que les String de jawa sont constants
Marsh Posté le 03-12-2003 à 00:29:10
SchnapsMann a écrit : bah oui d'autant que les String de jawa sont constants |
tu réponds "bha oui" à quoi ???
et qu'est ce que tu appelles constant ? par rapprt à immuable, je veux dire ...
Marsh Posté le 03-12-2003 à 00:29:53
benou a écrit : |
oui c'est bien ça que je voulais dire, je parlais pas des références hein
donc += sur un String, c'est sur que ça change pas le String
Marsh Posté le 03-12-2003 à 00:30:01
benou a écrit : |
ben, je lis ça
Citation : |
j'essaie et je vois ce qu'il me semblait: que la variable passée n'est pas locale à la methode...
ou alors y'a un truc qui m'echapp
Marsh Posté le 03-12-2003 à 00:30:46
SchnapsMann a écrit : |
j'ai toujours pas compris ce que tu disais
Marsh Posté le 03-12-2003 à 00:33:55
au fait benou, le prend pas pour toi hein
je suis en train de faire un autre test qui là me montre que t'as raison mais y'a tjs un truc qui m'échappe.
Marsh Posté le 03-12-2003 à 00:34:51
the real moins moins a écrit : la variable passée n'est pas locale à la methode... |
a ce moment, quand je parlais de "la variale" je parlais de la référence, pas de l'objet qu'elle pointait.
regarde dans l'exemple de code que j'ai donné :
Code :
|
la variable "t" n'est pas affectée par l'appel de testCpyRef() parce que la variable "ref" de testCpyRef() est une copie de la valeur de la variable "t" => si tu changes la valeur de "ref" ca ne change pas la valeur de "t" : c'est 2 variables différentes
Marsh Posté le 03-12-2003 à 00:35:55
the real moins moins a écrit : au fait benou, le prend pas pour toi hein |
nan nan t'inquiètes ... mais j'arrive pas à croire que ca vous étonne
c'est quoi qui t'échappe ?
Marsh Posté le 03-12-2003 à 00:36:17
et oui, les passages d'arguments de java sont toujours fait par valeur, fou non
gros rapel pour les cancres du fond:
en c++ :
void foo(int a); // par valeur
void bar(inr& a); // par référence
en java seul le premier cas est géré
Marsh Posté le 03-12-2003 à 00:36:19
Citation : |
et là "benou à raison".
ben c'est super con, mais je suis pas sur de piger pourquoi dans mon 1er exemple, l'objet sur lequel pointe ma reference est modifié par ma methode setText, alors que dans le 2e la nouvelle instance semble locale à cette foutue méthode, alors que la reference vient du dehors...
Marsh Posté le 03-12-2003 à 00:37:09
SchnapsMann a écrit : et oui, les passages d'arguments de java sont toujours fait par valeur, fou non |
ha non
Marsh Posté le 03-12-2003 à 00:38:40
nain porte quoi
remarque je connais pas java 1.5, peut être est-ce une nouveauté
Marsh Posté le 03-12-2003 à 00:40:09
on parle de passage par reference en java quand meme, merde, arretez de remettre en doute tout ce que je crois connaitre maintenant
Marsh Posté le 03-12-2003 à 00:41:20
the real moins moins a écrit : on parle de passage par reference en java quand meme, merde, arretez de remettre en doute tout ce que je crois connaitre maintenant |
En java, tu passes une référence par valeur en argument d'une méthode. C'est pas pareil que de passer une variable par référence en argument
Marsh Posté le 03-12-2003 à 00:45:46
benou a écrit : |
Bin putain, tu crois que le gars de base il a bien pigé ta phrase ?
J'te cite :
Citation : Quand tu appelles une méthode en java et que tu passes en arguments des objets, c'est le pointeur que tu passes : la veleur de la variable, c'est à dire l'adresse mémoire. C'est un passage par valeur ! |
Et après tu gueules qu'on mélange tout
benou a écrit : |
(la preuve )
OK, bin chu d'accord que mon += était pas du tout judicieux. Faisons un .replace('h', 'x') à la place
Si on est déjà 2 à pas tout piger c'que tu racontes (p'têt 3 avec SchnapsMann, j'sais pas), c'est p'têt qu'y a un problème dans la formulation, non ?
Marsh Posté le 03-12-2003 à 00:46:57
SchnapsMann a écrit : void foo(int a); // par valeur |
nan mais là tu prend le cas d'un type primitif, c'est pas ce qu'il y a mieux comme exemple
SchnapsMann a écrit : remarque je connais pas java 1.5, peut être est-ce une nouveauté |
nan, mais n'importe quoi ! c'est impossible de changer un truc comme ca !
Marsh Posté le 03-12-2003 à 00:47:43
the real moins moins a écrit : on parle de passage par reference en java quand meme, merde, arretez de remettre en doute tout ce que je crois connaitre maintenant |
ouais dans le cas des objets, mais dire "passage par référence" revient au même que de dire "passage par valeur des pointeurs"
Marsh Posté le 03-12-2003 à 00:47:52
C'est super, personne pige rien à ce que racontent les autres
Bon ba moi j'm'en vais, il pue la mort ce topic
Marsh Posté le 02-12-2003 à 16:04:53
Bonjour a tous et toutes,
j'ai un petit soucis avec une de mes methodes, dont voici le code :
Mon probleme est le suivant :
- a l'endroit (1) de la methode je met dans la variable "chemPart" ce qu'il y a dans "bl". Si je fais un affichage, on voit bien que "chemPart" a bien pris la valeur de "bl".
- par contre, lorsque j'affiche en (2) le contenu de ma variable "chemSousPart" que j'avais passee en argument, alors la je me rencontre qu'elle ne contient rien.
Je pense que cela vient du fait que certains objets ne pointent pas sur la meme chose mais je n'en suis pas sûr.
Je pense que c'est une erreur bête mais je n'arrive pas a la trouver !
Quelqu'un pourrait-il m'aider ?
Baba
Message édité par babthefox2002 le 02-12-2003 à 16:06:47