Slu
comment faire pour passer qqchose par reference en java ?
par exemple pour une fonction avec un parametre int que je modifie dans la fonction et que je puisse la recuperer la ou j appelle la fonction.
thx @+
Slu
comment faire pour passer qqchose par reference en java ?
par exemple pour une fonction avec un parametre int que je modifie dans la fonction et que je puisse la recuperer la ou j appelle la fonction.
thx @+
Un type primitif ne peut être passé par référence.
Tu peux utiliser un tableau d'entier dans lequel tu mets ta valeur, et tu récupères en retour la valeur modifiée, mais ce n'est pas très propre :
ou renvoyer la valeur modifiée en retour de la méthode :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 public void incrementerEntier(int[] tableau) { tableau[0] += 1; }
ou passer par un objet dans lequel tu as un attribut de type int :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 public int incrementerEntier(int entier) { return entier + 1; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 class Entier { public int i; public Entier(int i) { this.i = i; } } public void incrementerEntier(Entier entier) { entier.i += 1; }
Ah oui en fait j etais pas assez precis ... en fait pour c pour passer plusieurs int ... et donc en recuperer plusieurs ...
Inspire toi du 1er ou du 3ème exemple...
Pour passer un type primitif par reference il y a des classes pour cela : Boolean, Double, Integer, Float... C'est mieux que d'ecrire sa propre classe Entier par exemple.
Salut,
Heu... Ce n'est pas possible puisque ces classes sont immuables...Envoyé par Gfx
a++
Je n'ai pas dit le contraire, mais il suffit de changer la reference :
C'est bien ce que l'on fait avec les String tout le temps.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 public void incrementerEntier(Integer entier) { entier = new Integer(entier.intValue() + 462); }
Justement si tu changes la référence tu ne modifies pas l'objet passé en paramètre, mais tu crées un autre objet qui n'existera pas dans la méthode appellante...
Avec le code suivant :
On obtiens à l'affichage "0"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 public static void incrementerEntier(Integer entier) { entier = new Integer(entier.intValue() + 462); } public static void main(String[] args) throws Exception { Integer entier = new Integer(0); incrementerEntier(entier); System.out.println(entier); }
La modification des objets passé par référence ne peut se faire que par des méthodes de la classe (setter ou autre).
Mais comme les types wrappers sont immuable ce n'est pas possible...
a++
Heu oui en effet ^^ Mea culpa j'ai dit n'importe quoi.
ADI !
je passait par la, que veux tu dire quand tu dit qie :
je pensait que c'etait des objet comme les autres avec toutes leur proprieteEnvoyé par adiGuba
???
WDionysos
Une classe immutable est simplement une classe dont les objets ne changent pas de valeur une fois crees.
Comme quoi ca peut arriver à tout le mondeEnvoyé par Gfx
<mode mauvaise foi>
C'est le jetlag, je suis rentre en Californie hier.
</mode mauvaise foi>
))
Moi je croyais qu'en Java tous les paramètres de méthodes étaient passés en valeur, même les références d'objets...
En java tout est passé par référence au contraire. sauf les types primitifs. les types immuables sont d'ailleurs aussi passés par reference, mais vu qu'ils sont immuables... c'est un peu comme s'ils etaient passés par valeur... enfin, en raccourci
Dans ce cas on devrait pouvoir écrire des méthodes d'échange telles que par exemple :
Pour moi ceci confirme que toutes les variables sont passés par valeur, y compris celles contenant des références d'objets...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 public class Test { public static void swapStringBuffer(StringBuffer s1, StringBuffer s2){ StringBuffer temp = s1; s1 = s2; s2 = temp; } public static void main(String[] args) { StringBuffer s = new StringBuffer("toto"); StringBuffer s2 = new StringBuffer("tata"); System.out.println(s); //s vaut toto System.out.println(s2); //s2 vaut tata Test.swapStringBuffer(s,s2); System.out.println(s); //s vaut toujours toto System.out.println(s2); //s2 vaut toujours tata } }
Si je fais une erreur de raisonnement dites le moi hein, je veux juste comprendre, je prétends pas avoir raison...
Je confirme, pour les objets, ce sont des copies des références qui sont passées.
Par contre ce n'est pas l'objet lui-même qui est passé à la méthode mais bien une référence donc ce n'est pas à proprement parler un passage par valeur.
Certes, c'est bien la référence d'objet qui est passé à la méthode.
Mais bon en java, une variable peut contenir soit une constante primitive (entier, caractère), soit une référence vers un objet.
Ce qui me fait dire que c'est du passage par valeur c'est que quand on utilise la variable dans une méthode, c'est une copie de son contenu qui est transmis ce qui explique que l'on puisse écrire des méthode d'altération d'un objet (puisque l'on possède une copie de la référence vers l'objet) mais pas des méthodes d'échange (objet ou type primitif) ou d'altération d'un type primitif.
Oui je sais c'est ce que j'essaie d'expliquer dans mon message précédent, visiblement moins bien que toi je te l'accorde...
Mais moi j'appelle ça du passage par valeur.
Edit, tiens le message auquel j'ai répondu à disparu!
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager