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

Collection et Stream Java Discussion :

Je ne comprends pas pourquoi. La portée des variables dépends si c'est 1 tableau


Sujet :

Collection et Stream Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Points : 556
    Points
    556
    Par défaut Je ne comprends pas pourquoi. La portée des variables dépends si c'est 1 tableau
    Je n'arrive pas à m'expliquer pourquoi ce petit programme fonctionne comme ça. Pourquoi la variable est-elle modifiée dans la méthode main s'il s'agit d'un tableau et si ce n'est pas un tableau -> pas modifié.
    Pourquoi dans un cas c'est un passage par variable (ou objet) et dans un autre par valeur?
    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 TestMethodesVariables {
     
    	public static void maMethode(String[] a){
    		a[0]="Ce n'est pas ma chaine";
    	}
     
    	public static void maMethode(String a){
    		a="Ce n'est pas ma chaine";
    	}
     
    	public static void main(String[] args) {
    		String[] at = {"C'est ma chaine"};
    		String ax = "C'est ma chaine";
    		maMethode(ax);
    		maMethode(at);
    		System.out.println(at[0]);
    		System.out.println(ax);
    	}
    }
    Le résultat est :
    Ce n'est pas ma chaine
    C'est ma chaine

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 151
    Points : 151
    Points
    151
    Par défaut
    Citation Envoyé par cmako
    Je n'arrive pas à m'expliquer pourquoi ce petit programme fonctionne comme ça. Pourquoi la variable est-elle modifiée dans la méthode main s'il s'agit d'un tableau et si ce n'est pas un tableau -> pas modifié.
    Pourquoi dans un cas c'est un passage par variable (ou objet) et dans un autre par valeur?

    Le résultat est :
    Ce n'est pas ma chaine
    C'est ma chaine
    Il ne s'agit pas d'un passage par variable ou objet comme tu le dis(on dit plutôt par référence).

    En Java tous les paramètres sont passés par valeur , très précisement c'est la référence des objets qui est passée par valeur(C'est donc pour çà que l'on dit que Java passe les objets par référence).
    C'est ce qui explique que le tableau(un objet) que tu as passé dans la methode n'a pas pas engendré de modification

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Points : 556
    Points
    556
    Par défaut
    Citation Envoyé par kossistus
    Il ne s'agit pas d'un passage par variable ou objet comme tu le dis(on dit plutôt par référence).

    En Java tous les paramètres sont passés par valeur , très précisement c'est la référence des objets qui est passée par valeur(C'est donc pour çà que l'on dit que Java passe les objets par référence).
    C'est ce qui explique que le tableau(un objet) que tu as passé dans la methode n'a pas pas engendré de modification
    Je n'ai toujours pas compris explication.
    C'est le tableau qui a été modifié et pas le String.

  4. #4
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    On dit peut être pas pointeur, mais enfin le terme donne bien, à ceux qui viennent du C, une image correcte de ce qui se passe, il me semble.

    Il est cependant vrai que le bon terme en java est référence.

    Et pour ceux qui ne connaissent pas le C, le passage en paramètre d'objets équivaut à passer, non pas cet objet lui même, mais comme une sorte de flèche vers cet objet.

    Ainsi, lorsque tu désignes un tableau, tu utilises en fait une sorte de flèche vers ce tableau, non le tableau lui même, et si tu désignes un String, pareil.

    Quand tu modifies un élément du tableau paramètre, tu modifies non pas le paramètre, mais un contenu désigné par ce paramètre ; la sorte de flèche pointeur référence reste donc inchangé.

    Mais lorsque tu modifie le String paramètre, tu modifies le paramètre lui même ; la sorte de flèche change. Sa visibilité étant permise seulement dans le corps de la méthode, ce changement n'est visible que dans le corps de cette méthode, est invisible à l'extérieur.

    Voilà... est-ce plus clair ?

    Autre explication pour approfondir : Les objets sont manipulés avec des références.
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    238
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 238
    Points : 267
    Points
    267
    Par défaut
    Salut,

    Comme pour metre en evidence ce que dit giffftane voila ce qui est execute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public static void maMethode(String a){
    	a = new String ("Ce n'est pas ma chaine");
    	// La nouvelle chaine que tu viens de créer a la portée de la méthode, donc la chaine 'a' reste inchangée
    }
    a+

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Points : 556
    Points
    556
    Par défaut
    Citation Envoyé par gifffftane
    On dit peut être pas pointeur, mais enfin le terme donne bien, à ceux qui viennent du C, une image correcte de ce qui se passe, il me semble.

    Il est cependant vrai que le bon terme en java est référence.

    Et pour ceux qui ne connaissent pas le C, le passage en paramètre d'objets équivaut à passer, non pas cet objet lui même, mais comme une sorte de flèche vers cet objet.

    Ainsi, lorsque tu désignes un tableau, tu utilises en fait une sorte de flèche vers ce tableau, non le tableau lui même, et si tu désignes un String, pareil.

    Quand tu modifies un élément du tableau paramètre, tu modifies non pas le paramètre, mais un contenu désigné par ce paramètre ; la sorte de flèche pointeur référence reste donc inchangé.

    Mais lorsque tu modifie le String paramètre, tu modifies le paramètre lui même ; la sorte de flèche change. Sa visibilité étant permise seulement dans le corps de la méthode, ce changement n'est visible que dans le corps de cette méthode, est invisible à l'extérieur.

    Voilà... est-ce plus clair ?

    Autre explication pour approfondir : Les objets sont manipulés avec des références.

    Merci, c'est un peu plus clair, mais bon...
    Une question comment alors on fait pour passer la référence sur un String de façon pour que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(ax);
    affiche Ce n'est pas ma chaine ?

  7. #7
    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
    Tu ne peux pas faire ce que tu veux car les objets String sont des objets inaltérables, c'est à dire que toute opérations sur les chaines ne modifie pas la valeurs de la références mais renvoie une nouvelle instance de la classe String.

    Soit le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String s ="toto";
    s.toUpperCase();
    System.out.println(s);
    A ton avis qu'est ce que ça affiche? "TOTO"? Et non ça affiche "toto".

    En effet, les objets de types String sont inaltérables et l'appel de la méthode toUpperCase() renvoie une nouvelle instance de la classe String de valeur TOTO mais ne modifie pas la référence de l'objet s qui vaut toujours toto.

    Pour modifier la valeur de l'objet s, il faut lui affecter la nouvelle instance renvoyée par la méthode, soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    s = s.toUpperCase();
    Or comme on t'a dit qu'il n'est pas possible de modifier la référence d'un objet passé en paramètre d'une méthode dans le corps de celle-ci et que les objets String ne peuvent être modifiés que par l'affectation d'une nouvelle référence, tu ne peux pas écrire de méthode ayant comme signature :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public static void maMethode(String a)

    qui modifie l'objet String passé en paramètre.


    La solution pour modifier un objet String par l'appel d'une méthode consiste à faire renvoyer un objet String à la méthode que tu pourra affecter à ta variable String. Comme ça par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public static String maMethode(){
          return "Ce n'est pas ma chaine";
    }
    Et tu l'affecte ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String ax = "C'est ma chaine";
    ax = maMethode();
    Là ça affichera "ce n'est pas ma chaîne".

    Bien sur, rien ne t'empêche de passer quand même ton objet String à modifier en paramètre (par exemple si tu as des opérations à faire dessus).

    J'espère que je suis clair dans mes explications.

    -"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)

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

Discussions similaires

  1. [PHP 5.3] Portée des variables, je comprends pas
    Par ZeFiF dans le forum Langage
    Réponses: 3
    Dernier message: 20/04/2015, 11h17
  2. [debutant] - Simple script qui plante IE.. comprend pas pourquoi..
    Par ShinJava dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/08/2006, 23h06
  3. Réponses: 2
    Dernier message: 14/01/2006, 20h29
  4. Comprends pas pourquoi ca marche pas
    Par cellimo dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 08/11/2005, 22h10
  5. error LNK 2019... comprends pas pourquoi ?
    Par MonsieurAk dans le forum MFC
    Réponses: 2
    Dernier message: 29/04/2005, 15h06

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