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 :

toString et Object


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 18
    Par défaut toString et Object
    Bonjour,

    je suis débutant en java et je n'ai pas fait beaucoup de langage objet dans ma vie.
    J'ai déjà une 1ère question qui porte sur toString()
    j'ai cherché une définition et de l'aide dessus et la seule chose que j'ai trouvé c'est de bien c'est "Returns a string representation of the object." (dans la doc java).
    Mais je ne comprend pas le concept, l'utilité, bref à quoi ça sert de faire maValeur.toString()

    Ensuite, j'ai récupéré un exercice qui est la création d'une classe Pile qui empile et dépile des int. J'ai compris le code à la lecture, sauf une petite chose dans la méthode toString redéfinie comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public String toString(){
        StringBuffer sb = new StringBuffer("[");
        for( int i=ptr-1;i>=0;i--){
            sb.append(Integer.toString(zone[i]));
            if(i >0) sb.append(", ");
        }
        sb.append("]");
        return sb.toString();
      }
    "zone" est défini plus haut comme un tableau d'entier.

    Le bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sb.append(Integer.toString(zone[i]));
    siginifie t il que je vais "append" à sb la représentation string de zone[i] qui va devenir un int grâce à Integer ?

    L'exercice me demande, une fois que j'ai compris le fonctionnement de la classe Pile, d'empiler des objects. J'ai compris qu'il fallait que je déclare des Object à la place des int dans ma classe mais j'ai essayé de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sb.append(Integer.toString(zone[i]));
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sb.append(Object.toString(zone[i]));
    et il compile avec une erreur.

    Comment faire pour récupérer un objet grâce à la méthode toString ?

    Merci d'avance, j'espère avoir été clair.

  2. #2
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Bonjour et Bienvenu dans nos forums.

    La méthode toString() permet principalement d'afficher les objets via System.out.print[ln]. Cette dernière ne sait afficher que les types simples comme int, char, float, etc. ainsi que le String. Pour pouvoir afficher d'autres objets plus complexes, elle invoque la méthode toString() de l'objet à afficher.

    Le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public String toString(){
        StringBuffer sb = new StringBuffer("[");
        for( int i=ptr-1;i>=0;i--){
            sb.append(Integer.toString(zone[i]));
            if(i >0) sb.append(", ");
        }
        sb.append("]");
        return sb.toString();
      }
    est une version optimisé de ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public String toString(){
        String res="[";
        for( int i=ptr-1;i>=0;i--){
            res = res + Integer.toString(zone[i]) +", ";
        }
        res = res+"]";
        return res;
      }
    pour une pile contenant :
    Cette fonction te retourne la chaine "[4, 6, 2, 8]". Donc, si on fait System.out.println(pile), on va invoquer pile.toString() et afficher son résultat.
    Le StringBuffer ici est un objet qui est plus adapté aux traitements sur les chaines qui sont couteux.
    Integer.toString(x) transforme l'entier x donné en paramètre en sa représentation comme chaine de caractères.

    L'exercice me demande, une fois que j'ai compris le fonctionnement de la classe Pile, d'empiler des objects. J'ai compris qu'il fallait que je déclare des Object à la place des int dans ma classe mais j'ai essayé de remplacer
    Pour ce faire, il faut remplacer le type des éléments du tableau zone de int par Object, ainsi que tous les paramètres des fonctions. PAr exemple, remplace empiler(int x) par empiler (Object x) , etc. C'est ça ce qui est important dans l'exercice. La partie toString est purement pour faire zolie.
    Donc, pour le toString, tu fais simplement sb.append(zone[i].toString()) car zone[*] est un Object qui définit d'office toString(). Si celui qui a défini les objets de la pile a pris la peine de réimplémenter toString() comme tu l'as fait dans Pile, t'auras un beau résultat dans la chaine représentant la pile.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class Personne{
      private String nom;
      private int age;
     
      //Les getters et les setters de nom et age.
     
      public String toString(){
        return "("+nom+":"+age+")";
      }
    }
    et dans la pile :
    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 String toString(){
        StringBuffer sb = new StringBuffer("[");
        for( int i=ptr-1;i>=0;i--){
            sb.append(zone[i]);
            if(i >0) sb.append(", ");
        }
        sb.append("]");
        return sb.toString();
      }
    :
    :
    Quand tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Pile p = new Pile();
    p.empiler(new Person("lui", 15));
    p.empiler(new Person("elle", 325));
    System.out.println(p);
    Tu auras comme résultat:
    [(lui:15), (elle:325)]
    Bonne chance.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 282
    Par défaut
    Citation Envoyé par djo.mos Voir le message
    est une version optimisé de ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public String toString(){
        String res="[";
        for( int i=ptr-1;i>=0;i--){
            res = res + Integer.toString(zone[i]) +", ";
        }
        res = res+"]";
        return res;
      }
    pour une pile contenant :
    Cette fonction te retourne la chaîne "[4, 6, 2, 8]".
    Oh oui une occasion inespérée de reprendre un modérateur :p Avec ta fonction "optimisée" la sortie te donnera : "[4, 6, 2, 8, ]". Et oui car à chaque tour de boucle tu rajoutes ", " à la fin, donc même au dernier ^^

    La ligne du dessous est donc bien utile :
    C'était juste une mini remarque qui en fait n'apporte pas grand chose à la discussion, mes excuses

  4. #4
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    En effet oui
    Je te rappèle juste que le but était de simplifier au maximum le fonctionnement de la chose (toString), et enlever un pauvre virgule qui trainait à la fin n'apportait strictement rien quant à la logique de la chose .

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Par défaut
    Je vais en remettre une petite couche sans grand intérêt, pour simplifier il y a aussi le "+="

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public String toString() {
      String res = "[";
      for( int i=ptr-1;i>=0;i--)
        res += zone[i]+ i>0 ? ", " : "";
      res += "]";
      return res;
    }

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 282
    Par défaut
    J'en suis bien conscient, c'était juste le fait de pouvoir reprendre un maître du code ^^ Cf dernière ligne de mon post précédent

    Citation Envoyé par Napalm51 Voir le message
    C'était juste une mini remarque qui en fait n'apporte pas grand chose à la discussion, mes excuses

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 18
    Par défaut
    Merci beaucoup pour ces explications !
    C'est déjà plus clair, je pense avoir compris, je potasse un peu et je reviens si j'ai des soucis

Discussions similaires

  1. Notion de boucles dans Business Object
    Par lionelEIGIP dans le forum Deski
    Réponses: 1
    Dernier message: 08/04/2004, 11h26
  2. Réponses: 2
    Dernier message: 30/01/2004, 14h07
  3. [DDL] "object <table> is in use"
    Par TMuet dans le forum SQL
    Réponses: 4
    Dernier message: 26/01/2004, 10h18
  4. Réponses: 8
    Dernier message: 21/11/2003, 18h38
  5. Comment inserer des donnee de type Large Object !!
    Par josoft dans le forum Requêtes
    Réponses: 4
    Dernier message: 20/07/2003, 11h21

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