Modification de variable passée en paramètre (question de noob)

Modification de variable passée en paramètre (question de noob) - Java - Programmation

Marsh Posté le 24-01-2005 à 15:42:50    

Bonjour ! Problème de base, mais que je me pose pour la première fois depuis que je code en java.
 
De ce que j'ai pu lire partout, en java le passage de paramètre se fait toujours par référence (sauf pour les types primitifs). Pourtant, le code suivant :
 

Code :
  1. public static void main(String[] args) {
  2.  Integer var = new Integer(15);
  3.  setTo2(var);
  4.  System.out.println(var);
  5. }
  6. public static void setTo2(Integer variable)
  7. {
  8.  variable = 2;
  9. }


 
Me donne comme résultat "15". Où est l'erreur ? :??:  
 
Merci d'avance :sweat:

Reply

Marsh Posté le 24-01-2005 à 15:42:50   

Reply

Marsh Posté le 24-01-2005 à 15:46:38    

Référence OK, mais sais-tu ce que sont les objets immutables ?


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 24-01-2005 à 15:46:58    

tu rebind juste variable vers un autre Integer. var ne change pas. De puis les Integer sont immutables. Donc même si c'était faisable, ça le serait pas :)

Reply

Marsh Posté le 24-01-2005 à 15:50:26    

Taz a écrit :

Donc même si c'était faisable, ça le serait pas :)


Ca au moins, c'est clair  :D  


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 24-01-2005 à 15:50:42    

En gros y'a pas d'erreur !

Reply

Marsh Posté le 24-01-2005 à 15:52:18    

Ta méthode reçoit une copie de la référence passée en parametre donc à ce moment là, tu as 2 variables référençant le même objet.
 
Si tu fais en sorte qu'une des 2 variables référence un autre objet, cela n'implique pas que les autres variables changent.
 
Je sais pas si j'ai été clair...

Reply

Marsh Posté le 24-01-2005 à 16:03:29    

bidem a écrit :

Ta méthode reçoit une copie de la référence passée en parametre donc à ce moment là, tu as 2 variables référençant le même objet.
 
Si tu fais en sorte qu'une des 2 variables référence un autre objet, cela n'implique pas que les autres variables changent.
 
Je sais pas si j'ai été clair...


 
Si j'ai bien compris, c'est la différence, en C, entre faire
 
void setTo2(int *variable) (ce que fait java ici)
 
et void setTo2(int **variable)
 
En C, la première solution me permet de modifier le contenu de variable, mais pas ici car Integer est immutable (on peut pas modifier son contenu).
 
Donc pour "modifier" un Integer, faut que je fasse pointer sur un autre integer, donc faut que je modifie ce vers quoi la référence pointe, donc faut utiliser la seconde solution qui n'existe pas en java.
 
J'ai compris ou je dis n'importe quoi ? :??: Et quelle est la solution alors pour faire cette opération ?

Reply

Marsh Posté le 24-01-2005 à 16:10:19    

en java, tu ne peux pas modifier directement le paramètre, ou plutot, ca n'a pas d'incidence sur l'appelant. Par contre, tu peux modifier l'état de l'objet, c'est à dire appeler des méthodes qui vont modifier l'état interne (modifier ses attributs) des objets passés en paramètres.
 
ex :  

Code :
  1. public class MonInt {
  2.    private int val;
  3.    public MonInt(int val) {
  4.       this.val = val;
  5.    }
  6.    public int getVal() {
  7.       return val;
  8.    }
  9.    public void setVal(int val) {
  10.       this.val = val;
  11.    }
  12.    public String toString() {
  13.       return Integer.valueOf(this.val);
  14.    }
  15. }


Code :
  1. public static void main(String[] args) {
  2.         MontInt var = new MontInt(15);
  3.         setTo2(var);
  4.         System.out.println(var);
  5.     }
  6.    
  7.     public static void setTo2(MonInt variable)
  8.     {
  9.         variable.setVal(2);
  10.     }


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 24-01-2005 à 16:53:29    

Je pensais effectivement à ça (je le fais en général, c'est d'ailleurs pour ça que j'ai jamais eu à me poser cette question) mais bon je pensais pas que c'était indispensable dans ce cas...
 
Merci !  :hello:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed