Partage
  • Partager sur Facebook
  • Partager sur Twitter

String invariable

Sujet résolu
    8 mars 2007 à 20:37:57

    bonsoir a tous,
    voici le code suivant:

    class Personne
    {private String nom;
     private String societe;


    public Personne(String leNom)
    {nom=leNom.toUpperCase();
    societe=new String("?");
    }

    public void fixeSociete(String uneEntreprise)
    {societe=uneEntreprise;}


    public String getNom()
    {return(nom);}


    public String getSoc()
    {return(societe);}


    public static void main(String [] args)
    {Personne p1=new Personne("Ranell");
    p1.fixeSociete("JAVA SA");
    System.out.print("nom :"+p1.getNom()+",societe :"+p1.getSoc());
    }}



    ma question c'est: comment societé peut changer de nom alors qu'elle est de type String et un String c'est un type invariable??
    merci de votre aide :)
    • Partager sur Facebook
    • Partager sur Twitter
      8 mars 2007 à 21:14:42

      o_O j'sais pas où t'a été pêché que String est invariable...
      il peut très bien varier...
      pour qu'il ne varie pas, il faut, lors de sa création ajouter final :

      private final String unStringInvariable = "hello world";


      EDIT : et dans ton cas, c'est parfaitement inutile ;)
      • Partager sur Facebook
      • Partager sur Twitter
      Altarapp.com - Applications, Code Snippets, API Wrappers et etc, le tout en C# le plus clair du temps!
        8 mars 2007 à 21:30:01

        en fait j'ai lu ça dans un livre qui parle de String comme etant invariable et de stringbuffer comme etant variable. alors tu vois je pars de la comparaison des deux,et chui un peu confuse!
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          9 mars 2007 à 8:12:25

          J'ai compris. Le mot invariable n'est pas a prendre au sens ou tu l'entend.
          C'est la donnée en mémoire qui est invariante, pas le membre "sociétée".
          Quand à l'initialisation tu crée une string avec valeur "?", Java crée l'objet en mémoire et l'assigne à la variable membre "societe". Quand tu appelle ta fonction "fixsociete", Java crée un nouveau objet mémoire pour l'assigner. La nouvelle variable en mémoire n'est pas une modification de l'ancienne mais une nouvelle.
          Je sais pas si c'est clair mais regarde la différence avec stringbuffer.
          Avec stringbuffer, apres l'avoir créé tu peut appelé sa methode "append" par exemple qui ajoute un nouveau caractere ou chaine à la fin. Dans ce cas, en mémoire, c'est toujours le même objet qui est utilisé. C'est pourquoi on ta dit que stringbuffer etait modifiable et non string.
          J'espere etre plus clair avec ce code :

          String t1="Bonjour";
          t1=t1+" le site des zeros";

          ici tu pourait penser que Java modifie la variable t1 en mémoire pour lui ajouter la fin de la phrase. Or le type String est imuable. En réalité Java crée un nouvel objet en mémoire contenant la phrase en entier. Ce n'est plus le même objet. Java ne peut pas modifier une variable string donc il en crée un nouvelle.
          Pour le stringbuffer le même code devient:

          StringBuffer b = new StringBuffer("Bonjour");
          b.append(" le site des zeros");

          Ici Java n'a pas crée de nouvelle objet en mémoire il a simplement modifié celui existant.

          Pour une String, des que tu modifie une valeur, Java crée une autre variable en mémoire. C'est par ce que la variable en mémoire n'est pas modifiable mais la variable "societe" peut pointer vers un autre objet. C'est pourquoi de l'exterieure tu a l'impression que la variable est modifier. En réalité c'est un autre objet.

          Je sais pas si j'ai été très clair mais la question des objets imuable/modifiable n'est jamais facile a expliquer.
          • Partager sur Facebook
          • Partager sur Twitter
            9 mars 2007 à 9:28:58

            merci beaucoup ChristopheG ton explication m'a éclairci plein d'ambiguité :D
            • Partager sur Facebook
            • Partager sur Twitter

            String invariable

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown