IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Modification du paramètre d'une méthode


Sujet :

Langage Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Modification du paramètre d'une méthode
    Bonjour tout le monde,

    J'ai une question concernant la modification des variables que l'on passe en paramètre d'une méthode ayant un effet de bord dessus.

    je vous donne mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class TestInt {
    	public void modifierInt(int i) {
    		++i;
                    System.out.println("i = " + i);
    	}
     
    	public static void main(String[] args) {
    		int j = 3;
    		new TestInt().modifierInt(j);
    		System.out.println("j = " + j);
    	}
    }
    Ca me retourne ceci:
    Je m'attendais plutôt à ce qu'il me dise: j = 4, dans la mesure où i est un type primitif (int), donc il n'y a pas d'histoire de copie de références..

    Pourriez-vous m'éclairer SVP?
    D'avance merci

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    en java, tous les paramètres de méthode sont toujours passés par copie.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    en java, tous les paramètres de méthode sont toujours passés par copie.
    Merci de ta réponse.

    Ça veut dire qu'en Java, une méthode ne peut jamais avoir d'effet de bord sur ses paramètres?

    Pourtant, il me semble qu'une fois, une méthode m'a modifié une variable que je lui passais en paramètre dans une autre classe appelante, ça m'a coûté d'ailleurs un sacré bug

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Points : 909
    Points
    909
    Par défaut
    Citation Envoyé par imad1903 Voir le message
    Ça veut dire qu'en Java, une méthode ne peut jamais avoir d'effet de bord sur ses paramètres?
    Pourtant, il me semble qu'une fois, une méthode m'a modifié une variable que je lui passais en paramètre dans une autre classe appelante, ça m'a coûté d'ailleurs un sacré bug
    Si tu passes un objet en paramètre, tu peux toujours appeler des méthodes sur cet objet qui modifieront son état interne...

    Essaie ce bout de code, pour voir :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    public class WrappedInteger {
    	private int value;
    	public WrappedInteger(int value) { this.value = value; }
    	public int getValue() { return this.value; }
    	public void setValue(int value) { this.value = value; }
     
    	public static void test1(WrappedInteger o)
    	{
    		o = new WrappedInteger(0);
    	}
     
    	public static void test2(WrappedInteger o)
    	{
    		o.setValue(0);
    	}
     
    	public static void main(String[] args)
    	{
    		WrappedInteger o1 = new WrappedInteger(1);
    		System.out.println(o1.getValue());
    		test1(o1);
    		System.out.println(o1.getValue());
     
    		WrappedInteger o2 = new WrappedInteger(2);
    		System.out.println(o2.getValue());
    		test2(o2);
    		System.out.println(o2.getValue());
    	}
    }

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Merci Astartee de ta réponse.

    Donc si je comprends bien, si j'ai envie de modifier une variable de type primitif que je passe en paramètre, je suis obligé de l'encapsuler dans un objet du type du wrapper correspondant, en vue d'en modifier l'état interne, c'est ça?

  6. #6
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Citation Envoyé par imad1903 Voir le message
    Merci Astartee de ta réponse.

    Donc si je comprends bien, si j'ai envie de modifier une variable de type primitif que je passe en paramètre, je suis obligé de l'encapsuler dans un objet du type du wrapper correspondant, en vue d'en modifier l'état interne, c'est ça?
    Non pas un Wrapper, car les Wrappers étant immutables, tu retomberas sur le même problème.

    Mais il faut effectivement encapsuler ta variable primitive dans un objet.

    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    les règles sont simple


    tous les paramètres sont passé par copie
    Toute variable qui n'est pas un primitf est une référence


    Donc quand tu passe un objet en paramètre d'un méthode, tu passe une copie de la référence.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    les règles sont simple


    tous les paramètres sont passé par copie
    Toute variable qui n'est pas un primitf est une référence


    Donc quand tu passe un objet en paramètre d'un méthode, tu passe une copie de la référence.
    Justement, dans mon exemple la variable que je passe en paramètre est un primitif..
    Mais bon là je chipote, la réponse de Deadpool complémentaire à celle de Astartee me va bien
    Merci à vous tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comment passer un ArrayList comme paramètre d'une méthode
    Par itmak dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 22/11/2008, 10h31
  2. Réponses: 1
    Dernier message: 30/01/2008, 19h41
  3. [bash]Modification de paramètres dans une boucle
    Par troumad dans le forum Shell et commandes GNU
    Réponses: 18
    Dernier message: 28/10/2007, 16h05
  4. [POO] Deux paramètres dans une méthode ?
    Par SBL69 dans le forum Langage
    Réponses: 2
    Dernier message: 18/09/2007, 11h54
  5. Limite de paramètres d'une méthode SOAP
    Par Thierry67 dans le forum Delphi
    Réponses: 1
    Dernier message: 23/08/2006, 11h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo