Passer un entier par adresse en JAVA

Résolu/Fermé
Mr Debutant - 23 déc. 2003 à 18:01
 Grouchy - 14 mars 2012 à 16:10
Salut à tous !

Wouala ... la question me semble super bidon ... n'empeche que j'coince !

Lors d'un appel à une méthode, je veux changer la valeur d'un entier ... ce qui se ferait en C par un passage par adresse.

Donc là j'utilise l'objet Integer (puisque les objets sont passés par référence), le hic c'est que j'trouve pas de méthode qui modifie la valeur d'un Integer ...
y a que des affectations du genre :
monInteger = new Integer( 10 ) ;

Mais ca ca marche pas puisque ca change la référence de l'objet et pas la valeur de l'entier...

Z'auriez une solution ???


Merci d'avance a tous !!

Bonne fetes :)
A voir également:

11 réponses

Utilisateur anonyme
24 déc. 2003 à 13:43
Hello, nouvel Essai (un peu tordu) ???

public class Essai
{
private Integer j;

public Essai()
{
j = new Integer(0);
}

public static void main (String args[])
{
Essai essai = new Essai();
essai.appelante();
}

public void testPassage(Integer i)
{
System.out.println("Avant modification " +i.toString());
j = i.valueOf("100");
System.out.println("Apres testPassage " + getJ().toString());
}
public void appelante()
{
Integer nb = new Integer(20);
testPassage(nb);
System.out.println("Apres testPassage " + j.toString());
}

public Integer getJ()
{
return j;
}

}
1
J'arrive un peu tard ;), mais bon, ça peut toujours aider...
Voici ce que j'ai compris:
Les types primitifs (int, float, etc.: qui commencent par une minuscule) sont passés par valeur.
Les types complexes (tous les autres, tous les objets) sont passés par référence MAIS certains d'entre eux sont IMMUTABLES (tous les wrappers: Integer, Float, etc. + String + ?), autrement dit, lorsqu'ils sont modifiés, une nouvelle zone mémoire est créée...
Conséquence: lorsque l'on passe un type immutable comme paramètre à une méthode, on passe la référence, mais dès la 1ère modification, une autre zone est créée, donc dans la méthode appelante, le paramètre n'est pas mis à jour!
Solution: créer une classe qui encapsule le type primitif ou le wrapper.
C'est clair?
0
Utilisateur anonyme
23 déc. 2003 à 20:04
Bonsoir,
Ne serais-tu pas en train de confondre le type numérique int et la classe Integer qui est la classe Wrapper du type numérique int?
0
Nan nan j'utilise bien un objet de type Integer comme argument pourtant ...
En gros, voilà un exemple simplifié de ce que j'voudrais faire :

public void test( Integer paramInteger) {
paramInteger = new Integer( valeurCalculee);
// ou qq choz ds ce gout la pour recupere une valeur dans paramInteger ...
}

public void methodeAppelante( ) {
Integer monInteger;

test(monInteger);
// ici monInteger a la valeur calculee dans la methode test
}


Remarque : tt en sachant que ma methode "test" renvoie en fait deja un objet et c'est pour ca que j'renvoie pas directement l'Integer

Merci de vouloir m'aider philtrain en tt cas :o)
0
Utilisateur anonyme
23 déc. 2003 à 21:42
re,
Je ne comprend pas trop ta démarche...
Pourquoi vouloir changer la valeur d'un entier en passant par un Wrapper?
paramInteger = new Integer(valeurCalculee); construit un nouvel objet de type Integer qui représente l'entier valeurCalculee
la méthode test ne renvoie rien du tout, elle est de type void.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Heu vi vi test est de type void mais c'etait pour simplifier (finalement j'vois que ca ne brouille les cartes plus qu'autre chose !! :o)

La veritable méthode que j'ai codée renvoie un objet, c'est ce que je voulais dire ...
Ma demarche en C s'implementerai de cette facon :
float test( int *paramAmodifier) {
float reel;

*paramAmodifier = valeurEntiereCalculee;
reel = valeurReelleCalculee ;

return valeurReelle;
}


En gros ma méthode renvoie deja un objet ; mais j'ai également besoin en sortie de ce fameux entier ...

J'espere avoir ete clair :o/
Merci encore une fois !
0
Utilisateur anonyme
24 déc. 2003 à 01:42
Ben alors, pour récupérer la valeur de l'enveloppeur sous forme d'un entier, il suffit de faire:
int monEntier = monInteger.intValue();
non?
0
Vi vi ca j'suis d'accord, mais en fait j'sais pas modifier la valeur contenue dans le wrapper qd j'suis dans la méthode ...

Voilà le code java qui révèle mon problème :
public void testPassage(Integer nb) {
System.out.println("Avant modification " + nb.toString());
nb = nb.valueOf("100");
System.out.println("Apres modification " + nb.toString()); s
}

public void appelante() {
Integer nb = new Integer(20);

testPassage(nb);
System.out.println("Apres testPassage " + nb.toString());
}

Ca ca me donne :
Avant modification : 20
Apres modification : 100
Apres testPassage : 20

Tu vois mon probleme se situe au niveau de la ligne :
nb = nb.valueOf("100");

Qu'est-ce que j'pourrais faire pour réellement modifier la valeur qui est dans l'Integer nb, pour qu'en sortie de la méthode, j'récupère bien 100 ici ?

Merci en tt cas de te donner tt ce mal !
0
Utilisateur anonyme
24 déc. 2003 à 11:04
Bonjour,

Est-ce que ceci peut t'aider ?:

public class Essai
{
public static void main (String args[])
{
Essai essai = new Essai();
essai.appelante();
}

public Integer testPassage(Integer i)
{
System.out.println("Avant modification " +i.toString());
i = i.valueOf("100");
System.out.println("Apres testPassage " + i.toString());
return i;
}
public void appelante()
{
Integer nb = new Integer(20);
nb = testPassage(nb);
System.out.println("Apres testPassage " + nb.toString());
}

}

a+
0
Bonjour philtrain,

En fait dans mon véritable code, la méthode qui est représentée ici par testPassage( ), renvoie déjà qq chose ...
Du coup, je ne peux pas faire le :
return i;

C'est justement mon problème ... comment récupérer cette nouvelle valeur de i sans passer par un return ... :o/

Merci de te pencher sur la question :o)
0
grofwa Messages postés 440 Date d'inscription jeudi 24 juillet 2003 Statut Membre Dernière intervention 21 juillet 2006 479
24 déc. 2003 à 11:20
Lis ceci, ça pourrait t'intéresser :

http://www.dimi.uniud.it/labs/documentazione/java/tips/Tip39.html

M.
0
Merci à jo (4 ans après) qui a su répondre à une de mes intérrogations
0