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 :

explication sur la modification de variables


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Femme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2014
    Messages : 30
    Points : 11
    Points
    11
    Par défaut explication sur la modification de variables
    Bonjour,

    J'essaie de comprendre un exercice concernant l'exécution du programme suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class Question{
      public static void main (String[] args){
        int n=0;
        int [] tabn= new int [1];
        tabn[0]=8;
        String s= "2013";
        modifier (n,tabn,s);
        System.out.println ("n="+n+ "tabn="+tabn[0]+ "s="+s);
      }
     
      static void modifier (int n, int[]y, String z){
        n=3;
        y[0]=3;
        z="2014";
    La question est sonnez le résultat de l'exécution.
    Comme je suis débutante et que j'ai du mal à comprendre le pas à pas, est ce que quelqu'un pourrait m'expliquer svp ?

    Après modification : est ce que n=3 ? tabn=3 et s devien Z donc "2014" ?

    Merci d'avance,
    rose

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Pour connaitre la réponse, il suffit de te souvenir de deux choses primordiales en java:

    1) tous les paramètre d'une méthode sont toujours passés par copie en java.
    2) une variable de type Objet ou Tableau est en fait une variable qui contient une référence vers le tableau. Donc en cas d'appel de méthode, c'est la référence qu'on copie, et non le contenu du tableau. La méthode et l'appelant référencent donc tous les deux le même tableau, mais via des variables différents.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2014
    Messages : 30
    Points : 11
    Points
    11
    Par défaut
    Bonjour tchize

    Merci pour ta réponse. Mais j'ai quelques lacunes. C'est pour cela que je viens sur le forum


    Dis moi si j'ai bien compris :
    La première variable c'est n, un entier. D’après ce que tu dis, elle n'est ni objet ni tableau. Donc elle est bien modifiée par la méthode "modifier" ?
    Ensuite on a ntab, un tableau. Dans son indice zero, on place la valeur 8.
    Le contenu de ce tableau ne change pas : tabn reste 8 ?
    Enfin, le string qui concerne une chaine de caractère n'est ni objet, ni tableau. Donc elle est modfiée ?

    J’espère que ce raisonnement est bon... Sinon, qu'est ce qui cloche ?
    Merci
    Rose

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 974
    Points : 1 825
    Points
    1 825
    Par défaut
    tu devrais lire une doc par sur le passage par valeur et le passage par référence

    car tes trois conclusions sont inversées. La ligne de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println ("n="+n+ "tabn="+tabn[0]+ "s="+s);]
    va écrire:

    n= 0 tabn= 3 s= 2013

    car:

    *) n inchangé car passage par valeur. (entier)
    *) tabn changé car passage par référence (tableau)
    *) s inchangé car passage par valeur (String)

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Sauf que tabn et s sont tous les deux des objets, donc passés de la même manière. (Disons, par valeur de la référence.)

    Mais en assignant tabn[0] = bidule on modifie ce que le tableau contient, et non pas quelle est la référence du tableau.
    Alors qu'en assignant s = bidule on modifie juste la référence, on ne change rien au contenu des objets.

    Le premier a donc pour effet de changer ce que contient le tableau. Le second ne change rien aux objets et n'a donc pas d'effet en dehors de la méthode.

  6. #6
    Membre à l'essai
    Femme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2014
    Messages : 30
    Points : 11
    Points
    11
    Par défaut
    Je vous remercie tous les deux pour ces explications.
    Je risque de poster un autre exemple un peu différent pour voir si ma réponse est correcte ou non.

    Celui-ci était apparemment très simple

    Bien Cdt,
    Rose

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Citation Envoyé par Rose22 Voir le message
    La première variable c'est n, un entier. D’après ce que tu dis, elle n'est ni objet ni tableau. Donc elle est bien modifiée par la méthode "modifier" ?
    Non, elle est passée par valeur, donc "en gros" par copie. La modification est purement locale à la méthode. Dis toi pour faire simple que toutes les variable en paramètre d'une méthode sont locales à la méthode (c'est le principe du passage par valeur). Les modification de n n'influencent pas l'appelant
    Citation Envoyé par Rose22 Voir le message
    Ensuite on a ntab, un tableau. Dans son indice zero, on place la valeur 8.
    Le contenu de ce tableau ne change pas : tabn reste 8 ?
    La variable y est locale à la méthode. Mais tableau est un objet. Donc y n'est qu'une référence. De même tabn n'est qu'un référence. Ainsi y est un référence, locale à la méthode, mais qui référence le même tableau que la variable tabn. On a donc bien copié la référence, mais pas l'objet. Dis toi pour faire simple que, en java, il est très dur de faire un copie d'un objet, rien n'est prévu en standard pour ça. Donc le jour où un objet sera "copié", tu ne pourra pas ne pas le voir Concrètement, comme tu va modifier le contenu de l'objet (valeur à l'indice 0) et non pas la référence (tu ne crée par par exemple un nouveau tableau), tu affecte aussi l'appelant.
    Citation Envoyé par Rose22 Voir le message
    Enfin, le string qui concerne une chaine de caractère n'est ni objet, ni tableau. Donc elle est modifiée ?
    Le String est un objet. Donc on a passé une copie de la référence vers le même objet que le main. Par contre, ici, dans ton code, on ne modifie pas le contenu de la String (les String sont particulières car immutable donc de toutes façons, ça aurait été impossible). Mais, on modifie la référence z, en lui attribuant une référence vers une nouvelle String. Comme je l'ai dit, les références, comme les autres variables, sont locale à la méthode. Si je modifie un référence, je ne fais la modification que en local dans la méthode. La variable s dans le main, elle, ne change pas.

    Un schéma simple à suivre:

    public void uneMethode(? a) (peu importe le ?)

    • si je fais a = ..... <- changement purement local à la méthode, pas d'influence sur l'appelant, puis qu'on ne fait qu'affecter une nouvelle valeur à a
    • si je fais a.xyz(...) <- affecte l'appelant si xyz fait des changement dans l'objet. Exemple la méthode add() sur un ArrayList, la méthode setNom() sur une Personne, ....
    • si je fais a[...] = ... <- affecte l'appelant puisqu'on change une case du tableau




    Après, c'est de la logique. Si je fait a=.... puis qu'ensuite je fait a.xyz(....) je ne change rien dans l'appelant. Le premier a = .... donne un nouvel objet comme référence à a, toutes les modification se faisant ensuite sur cet objet, ce n'est pas le même que dans l'appelant.

  8. #8
    Membre à l'essai
    Femme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2014
    Messages : 30
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par plawyx Voir le message
    tu devrais lire une doc par sur le passage par valeur et le passage par référence

    car tes trois conclusions sont inversées. La ligne de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println ("n="+n+ "tabn="+tabn[0]+ "s="+s);]
    va écrire:

    n= 0 tabn= 3 s= 2013

    car:

    *) n inchangé car passage par valeur. (entier)
    *) tabn changé car passage par référence (tableau)
    *) s inchangé car passage par valeur (String)
    ********************
    Merci beaucoup et désolée pour ma nullité. J'ai du mal à comprendre le vocabulaire de base. C'est peut etre cela qui me perturbe quand je fais mes exos. Et j'ai encore plus de mal avec les boucles LOL

  9. #9
    Membre à l'essai
    Femme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2014
    Messages : 30
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Non, elle est passée par valeur, donc "en gros" par copie. La modification est purement locale à la méthode. Dis toi pour faire simple que toutes les variable en paramètre d'une méthode sont locales à la méthode (c'est le principe du passage par valeur). Les modification de n n'influencent pas l'appelant

    La variable y est locale à la méthode. Mais tableau est un objet. Donc y n'est qu'une référence. De même tabn n'est qu'un référence. Ainsi y est un référence, locale à la méthode, mais qui référence le même tableau que la variable tabn. On a donc bien copié la référence, mais pas l'objet. Dis toi pour faire simple que, en java, il est très dur de faire un copie d'un objet, rien n'est prévu en standard pour ça. Donc le jour où un objet sera "copié", tu ne pourra pas ne pas le voir Concrètement, comme tu va modifier le contenu de l'objet (valeur à l'indice 0) et non pas la référence (tu ne crée par par exemple un nouveau tableau), tu affecte aussi l'appelant.

    Le String est un objet. Donc on a passé une copie de la référence vers le même objet que le main. Par contre, ici, dans ton code, on ne modifie pas le contenu de la String (les String sont particulières car immutable donc de toutes façons, ça aurait été impossible). Mais, on modifie la référence z, en lui attribuant une référence vers une nouvelle String. Comme je l'ai dit, les références, comme les autres variables, sont locale à la méthode. Si je modifie un référence, je ne fais la modification que en local dans la méthode. La variable s dans le main, elle, ne change pas.

    Un schéma simple à suivre:

    public void uneMethode(? a) (peu importe le ?)

    • si je fais a = ..... <- changement purement local à la méthode, pas d'influence sur l'appelant, puis qu'on ne fait qu'affecter une nouvelle valeur à a
    • si je fais a.xyz(...) <- affecte l'appelant si xyz fait des changement dans l'objet. Exemple la méthode add() sur un ArrayList, la méthode setNom() sur une Personne, ....
    • si je fais a[...] = ... <- affecte l'appelant puisqu'on change une case du tableau




    Après, c'est de la logique. Si je fait a=.... puis qu'ensuite je fait a.xyz(....) je ne change rien dans l'appelant. Le premier a = .... donne un nouvel objet comme référence à a, toutes les modification se faisant ensuite sur cet objet, ce n'est pas le même que dans l'appelant.

    *************

    Merci Tchize pour cet aide mémoire.... ;-)

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

Discussions similaires

  1. Breakpoint sur une modif de variable
    Par teska dans le forum Delphi
    Réponses: 8
    Dernier message: 26/06/2018, 14h50
  2. modification des variables sur fichier ini
    Par laala.hamid dans le forum Débuter
    Réponses: 9
    Dernier message: 08/09/2011, 00h27
  3. Petite explication sur les variables externes
    Par Ladgalen dans le forum Débuter
    Réponses: 10
    Dernier message: 15/10/2009, 15h41
  4. Explication sur variable
    Par donny dans le forum Linux
    Réponses: 4
    Dernier message: 21/06/2006, 10h27
  5. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 23h18

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