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

avec Java Discussion :

Passage de paramètre à une méthode : ma valeur ne change pas au retour de la méthode


Sujet :

avec Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 54
    Points : 47
    Points
    47
    Par défaut Passage de paramètre à une méthode : ma valeur ne change pas au retour de la méthode
    Bonjour,



    Je pose peut etre une question debile mais je suis pas sur de comprendre pourquoi mon code ci dessous ne marche pas.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public void update(int a, int b) {
     
        a = a + b;
      }
     
    public void main(){
     
    int a = 0;
     int b = 10;
     update(a, b);
     System.out.println("Result " + a);
    }


    En fait je m attendais a ce que j aie a=10 mais a est toujours egale a zero.

    Je pense que j ai rate quelaue chose !!!


    Merci de votre aide.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Java utilise un passage des paramètres dit par copie : lorsqu'il s'agit de paramètres de type primitif (comme int), le passage est par copie de valeur. Donc si tu modifies la valeur d'un des paramètres dans la méthode, la valeur de la variable correspondante, passée à l'appel en paramètre de la méthode, n'est pas modifiée.

    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
    public class Demo1 {
     
       public static void main(String[] args) {
          int a=1;
          test(a); // passe la valeur par copie
          System.out.println(a); // affiche 1
       }
     
       public static void test(int b) {
          System.out.println(b); // affiche 1
           b=10; // b est une copie de la valeur de a passée en paramètre (même si on avait mis a comme nom à la place de b (le nom des variables n'a rien avoir avec le fonctionnement de la chose)
          System.out.println(b); // affiche 10
       }
     
    }
    En cas de type non primitif, il s'agit d'une copie de référence : donc quand on modifie des informations dans l'objet référencé, la valeur est bien changée dans l'objet, qui est le même que dans la méthode appelante. Mais si tu changes la référence contenue (donc la valeur de la variable paramètre) dans la variable paramètre de la méthode, c'est pareil que pour une variable de type primitif : la variable dans la méthode qui appelle ne contiendra pas cette nouvelle référence.

    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
    public class Demo2 {
     
       public static class Exemple {
          public int a;
          public String toString() {
              return String.valueOf(a);
          }
       }
     
       public static void main(String[] args) {
          Exemple exemple = new Exemple();
          exemple.a=1;
          test(exemple); // passe la référence par copie
          System.out.println(exemple); // affiche 10
       }
     
       public static void test(Exemple exemplePar) {
          System.out.println(exemplePar); // affiche 1
          exemplePar.a=10; // exemplePar contient la copie de la référence contenue dans exemple, donc c'est bien le même objet qu'on modifie (
          System.out.println(exemplePar); // affiche 10
          exemplePar = new Exemple();  // on créé une nouvelle instance : exemplePar contient la référence vers cette nouvelle instance, mais exemple contiendra toujours la même référence
          exemplePar.a=100; // exemplePar contient une nouvele référence, donc c'est un autre object qu'on modifie
          System.out.println(exemplePar); // affiche 100
       }
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 54
    Points : 47
    Points
    47
    Par défaut
    Donc si j ai bien compris ta remarque, je ne peux jamais passer des types primitifs (int, float, double) comme parametres d une methode void et recuperer apres leurs valeus modifiees???

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Non, pas directement comme ça en tout cas, mais il y a plusieurs façons de le faire :

    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre éclairé Avatar de Sennad
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 180
    Points : 703
    Points
    703
    Par défaut
    Salut,

    Non tu ne pourras pas en utilisant cette façon de faire.
    Par contre tu peux faire différemment.
    Si dans méthode tu modifie les variables passées en paramètres, elle modifiera seulement la copie de ces variables ! Elles seront donc détruites une fois l'exécution de la méthode finie.
    Par contre si ta méthode modifie des attributs de la classe, tu n'auras pas ce problème.
    Je m'explique par un petit bout de code :

    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
     
        public int test = 10;
     
        public void main(String[] args) {
            System.out.println(test);
            alterVariable();
            System.out.println(test);
        }
     
        public void alterVariable(){
            test +=10;
        }
     
    Sortie console :
    10
    20

    Une autre solution est de faire en sorte que ta méthode return la variable une fois modifiée :
    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
     
        public int test = 10;
     
        public void main(String[] args) {
            System.out.println(test);
            System.out.println(alterVariable(test));
        }
     
        public int alterVariable(int a){
            a +=10;
            return a;
        }
     
    Sortie console :
    10
    20
    Seulement là la valeur 20 n'est stockée nulle part, si tu veux modifier l'ancienne valeur tu fais ça :
    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
     
        public int test = 10;
     
        public void main(String[] args) {
            System.out.println(test);
            test = alterVariable(test);
            System.out.println(test);
        }
     
        public int alterVariable(int a){
            a +=10;
            return a;
        }
     
    Sortie console :
    10
    20
    N'hésite pas à regarder les tutos Java dispos sur ce forum, ils sont vraiment bien fait et complet !
    Bon courage !
    -----------------------------------------------------------------------------------------
    Don't play with fire if u don't wanna get burn ! Clinton - Fearon
    ____________________________________________________Pensez au

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/10/2010, 11h07
  2. Problème de passage de paramètres à une méthode
    Par azimut01 dans le forum VB.NET
    Réponses: 0
    Dernier message: 26/02/2009, 21h38
  3. Action - passage de paramètres à une méthode
    Par burhud dans le forum Struts 2
    Réponses: 3
    Dernier message: 16/10/2007, 10h12
  4. Problème de passage de paramètres à une procedure
    Par momo62 dans le forum x86 16-bits
    Réponses: 2
    Dernier message: 22/12/2005, 15h22
  5. [XSLT][Saxon]passage de paramètres à une template
    Par RB Greg dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 12/05/2005, 16h29

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