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 :

Débutant Salut pb de tableau Objet.


Sujet :

Collection et Stream Java

  1. #1
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 15
    Par défaut Débutant Salut pb de tableau Objet.
    Voila,
    J'ai crée un tab[2] objet ( si je peux m'exprimer ainsi )...
    je l'initialise et et je crée les objets ( ici Nom et Age )
    que j'ai récupéré d'une Classe objet ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
                             /*Instanciation de la Classe Objet X */
    		X tabP = new X[2];
    		/*Instanciation de la Classe Objet SaiseNomAge */
    		SaisieNomAge CL_SaisieNomAge = new SaisieNomAge();
    		do
    		{
    		Noms = CL_SaisieNomAge.entrerNom();
    		Age = CL_SaisieNomAge.entrerAge();
    		tabP[i] = new Personnes() ;
    		tabP[i].setNom() = Noms ;
    		tabP[i].setAge() = Age ;
    		}while(condition);
    j'ai un message d'erreur
    setNom ( java.lang.String) in X cannot be applied to ()
    setAge ( int) dito...

    Alors je ne comprend plus rien, car il est possible de récupérer des objets d'autres objets Non??????

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Par défaut
    tabP[i].setAge(Age);

  3. #3
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 15
    Par défaut Salut .
    Merci pour ta reponse aussi rapide ..
    Ouais
    Ca marche ..
    Mais comme je suis débutant je peux me permettre Why?????....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tabP[i].setNom() = Noms ;
    		          tabP[i].setAge() = Age ;
    j'affecte bien Noms a mon tab via ma methode setNom ....????

  4. #4
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Par défaut
    tabP est un tableau d'objet X
    tabP[i] te renvoit le ième objet X

    donc sur tabP[i], tu peux appeler toutes les méthodes et toutes les propriétés publiques de X.

    Si dans ta classe X, tu as une propriété nom de visibilité publique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class X
    {
         public String nom;
    }
    tu peux y accéder de l'extérieur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    System.out.println(tabP[i].nom); // Accès en lecture, affiche le nom
    tabP[i].nom = "je donne une valeur"; // Accès en écriture, modifie le nom
    Ceci étant dit, en conception objet, on évite généralement (pour ne pas dire toujours) d'accéder directement aux propriétés de l'objet (on appelle ça l'encapsulation).

    Pourquoi ? Pour différentes raisons (modifier l'implémentation dans la classe X sans modifier son utilisation par d'autres classes clientes, autoriser l'accès à une variable uniquement en écriture ou uniquement en lecture, ...)

    Comment fait t'on ? A chaque propriété ppp de type Type, on associe une méthode d'accès en lecture (un accesseur public Type getPpp()) et une méthode d'accès en écriture (un mutateur public void setPpp(Type type))
    Donc pour la propriété nom de ta classe X, on définit les méthodes :
    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 X
    {
        public void setNom(String nouveauNom)
        {
             nom = nouveauNom;
        }
     
        public String getNom()
        {
            return nom;
        }
     
        private String nom;
    }
    Donc de l'exterieur, on utilise ces méthodes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    X objet = new X();
    objet.setNom("nouvelle valeur");
    System.out.println(objet.getNom()); // affiche "nouvelle valeur"
    J'espère que ça sera plus clair.

  5. #5
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 15
    Par défaut
    Ok ....
    merci pour ta réponse ...

    mais ma Classe instanciable X était déja comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    		public void setNom( String n )
    		{
    		String Nom = "" ;
    		Nom = n ;
    		}
    Et pourtant si j'ai bien compris sans etre prétentieux que ma premiere
    ligne devrais marché non???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tabP[i].setNom() = Noms ;

  6. #6
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Par défaut
    Je suis pas convaincu que tu ai tout compris mais bon, les forums, c'est fait pour ça :

    Déjà, dans ta classe X :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void setNom( String n )
    {
        String Nom = "" ;
        Nom = n ;
    }
    Premièrement
    n est un attribut de la méthode setNom(String n)
    et Nom est une variable locale à ta méthode setNom(String n) qui ne "vit" que dans cette méthode.
    La variable locale Nom prend donc la valeur de n mais à condition que la valeur soit passé entre les parenthèses :
    Si Noms contient "toto", le paramètre n de ta méthode setNom prend alors "toto" comme valeur et cette valeur "toto" est misa dans la variable locale Nom de ta méthode setNom(String n).


    Deuxièment,
    ce qui est fait dans ta méthode setNom(String n) ne sert à rien puisque la variable Nom "meurt" à l'accolade fermante.
    Regarde bien mon exemple de classe X dans mon précédent message, la variable nom se trouve dans la classe X et non dans la méthode setNom(String n), c'est alors ce qu'on appelle une variable d'instance.

  7. #7
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 15
    Par défaut
    c'est vrai
    Mais les methodes Fonctions et procédures ont du mal a renter .
    Bon encore merci ....

  8. #8
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 15
    Par défaut
    Re ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.print("\n Tab["+i+"]:" + tabPersonnes[i-1].getNom());
    i s'affiche
    tabPersonnes[i-1].getNom() est vide ????
    Encore une "boullete" ????

  9. #9
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Par défaut
    Si tu n'as pas modifié ta méthode setNom et que c'est encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void setNom( String n )
    {
        String Nom = "" ;
        Nom = n ;
    }
    c'est normal que getNom() te renvoit rien puisque comme je te le disait, ce code ne sert à rien.

    En revanche, si ton code ressemble désormais à mon exemple :

    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 X
    {
        public void setNom(String nouveauNom)
        {
             nom = nouveauNom;
        }
     
        public String getNom()
        {
            return nom;
        }
     
        private String nom;
    }
    getNom() te renvoit la valeur de la variable d'instance nom.
    Si tu appelles getNom() sans avoir préalablement appelé setNom("une valeur"), elle te retourne la valeur initiale de nom, à savoir null.

    Donc, je résume :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    X monX = new X(); // je crée un objet X
    System.out.print(monX.getNom()); // nom est à null (indéfini)
    monX.setNom("Je met une valeur dedans"); // nom vaut maintenant "Je met une valeur dedans" 
    System.out.print(monX.getNom()); // "Je met une valeur dedans"  est affiché !

  10. #10
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 15
    Par défaut
    Ca marche ....
    Merci pour ta patience et tes explications ......

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/02/2007, 00h06
  2. Réponses: 6
    Dernier message: 17/01/2006, 15h53
  3. Débutant : initialisation d'un tableau
    Par lebokto dans le forum C++
    Réponses: 7
    Dernier message: 02/11/2005, 15h50
  4. tableau objet
    Par harris_macken dans le forum C++
    Réponses: 9
    Dernier message: 20/06/2005, 21h04
  5. Réponses: 3
    Dernier message: 11/01/2005, 08h20

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