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 :

Polymorphisme Heritage reference


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 15
    Par défaut Polymorphisme Heritage reference
    Bonjour ,

    Une question me taraude .
    Pourquoi dans une méthode main , je ne peux pas appliquer la méthode afficheC () de la classe PointCouleur en utilisant le polymorphisme comme ci dessous :

    Point c = new PointCouleur (2 ,5 ,(byte)3);
    c.afficheC ();

    Je me retrouve bien avec un Objet de type Point qui référence Un PointCouleur?

    Alors que si je fais :
    Point c = new PointCouleur (2 ,5 ,(byte)3);
    c.affiche () ;

    je fais bien appel à la méthode affiche de la classe PointCouleur , pourquoi je peux appliquer la méthode affiche et ne peut pas appliquer la methode afficheC.

    merci

    Ces sources sont tirées du Livre de Delannoy .

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    Classe Point 
     
    public class Point {
        private int x ;
        private int y ;
     
        public Point() {
        }
     
        public Point (int x , int y ){
            this.x = x;
            this.y = y;
     
     
        }
     
        public void affiche (){
            System.out.println ("je suis en " + x + " " +  y );
        }
     
    }
     
    public class PointCouleur extends Point {
     
        private byte couleur ;
        public PointCouleur(int x , int y , byte couleur) {
            super (x,y);
            this.couleur = couleur;
        }
     
        public void affiche(){
            super.affiche();
            System.out.println (" et ma couleur est : " + couleur);
        }
     
        public void afficheC (){
            System.out.println (" et ma couleur est : " + couleur);
        }
     
    }
    Question

  2. #2
    Membre émérite Avatar de zorm
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Par défaut
    Tu as bien mis tes classes java dans des .java différents? ( en non à la suite comme tu le montres dans ton post!).
    Parce qu'il marche très bien ton exemple sinon

    Ca affiche;:
    je suis en 2 5
    et ma couleur est : 3


    AffichePoint.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class AffichePoint {
        public static void main(String[] args) {
            Point c = new PointCouleur (2 ,5 ,(byte)3);
            c.affiche () ;
        }
    }
    Point.java
    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 Point {
        private int x ;
        private int y ;
     
        public Point() {
        }
     
        public Point (int x , int y ){
            this.x = x;
            this.y = y;
     
     
        }
     
        public void affiche (){
            System.out.println ("je suis en " + x + " " +  y );
        }
     
    }
    PointCouleur.java
    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
    public class PointCouleur extends Point {
     
        private byte couleur ;
        public PointCouleur(int x , int y , byte couleur) {
            super (x,y);
            this.couleur = couleur;
        }
     
        public void affiche(){
            super.affiche();
            System.out.println (" et ma couleur est : " + couleur);
        }
     
        public void afficheC (){
            System.out.println (" et ma couleur est : " + couleur);
        }
     
    }

  3. #3
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 15
    Par défaut
    merci de ta réponse,

    oui je les ai bien mis dans des .java différent

    Pourquoi je ne peux pas faire cela :

    Point a ;

    a = new PointCouleur (2,3 ,(byte) 4);

    a.afficheC (); methode afficheC de la classe PointCouleur

  4. #4
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Tout simplement parce que ta variable est déclarée en tant que Point. Classe qui n'a pas de méthode afficheC.

    Si tu écris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((PointCouleur) p).afficheC
    Ca marchera même si c'est débile de faire ça.

    Si tu avais redéfini ta methode affiche dans PointCouleur cela appellerait la bonne méthode (celle de PointCouleur) en faisant p.affiche.
    Dans ton cas la méthode afficheC est inconnue de la classe Point donc le compilo râle, normal.

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  5. #5
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 15
    Par défaut
    salut merci

    mais comment cela se produit il?je veux dire par la quand je fais cela :

    Point p = new PointCouleur (2,3 , (byte)5 );

    p.affiche();

    C 'est bien un objet de type POINT , alors pourquoi la il aplliqueait la méthode affiche de la classe PointCouleur et pourquoi avec afficheC il ne l ' appliquerait pas.

    Par la je veux dire , il recherche d' abord si je comprends bien si la méthode existe dans la classe Point et ensuite descend dans la hierarchie d' heritage pour savoir si cette méthode est redefini?

    merci

  6. #6
    Membre éclairé
    Inscrit en
    Mars 2004
    Messages
    247
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 247
    Par défaut
    Ceci est le problème de overload override.

    Dans ta class PointColor(), tu redéfini la méthode tu redéfini la méthode affiche (même nom de méthode, même paramètre, même type de retoure) donc tu fais un override.
    Et lors d'un override la méthode choisi est celle de l'objet courant donc PointColor().

  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,



    Il y a deux étapes distinctes de "vérifications" :

    • A la compilation, le compilateur vérifié la cohérence des types. Ici tu appelles la méthode affiche() sur un référence de type Point Il vérifie que la classe/interface Point possède bien une telle méthode.

    • A l'exécution, la JVM appellera la bonne version de la méthode selon le type réel de l'objet, et appellera donc la méthode de la classe PointCouleur.




    Tu ne peux pas appeler afficheC() sur une référence de type Point car c'est incorrect pour le compilateur (point 1).


    a++

  8. #8
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Ca va faire long s'il faut tout expliquer en long en large et de travers , jette un oeil dans un cours java si ce n'est toujours pas clair après ce post.

    1 - Comme dans tout langage objet, pour appeler une méthode sur un objet il faut que cet objet possède la dite méthode.

    2 - Si une variable est déclarée d'un type mais référence dynamiquement un autre type alors a moins d'un cast explicite il n'est pas possible d'accéder a des méthodes non déclarées dans le type de déclaration.

    3 - Pasque je suis lent je précise ce qu'a dit ganga entre temps:

    A la compilation la signature de la méthode a appeler est determinée, ensuite a l'exécution la méthode avec cette signature est appelée sur le type dynamique. Si cette méthode a été redéfinie c'est celle ci qui est appelée sinon c'est celle de la classe mère.

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

Discussions similaires

  1. [Débutant] Polymorphisme, heritage, c#
    Par Alex63530 dans le forum C#
    Réponses: 5
    Dernier message: 18/06/2012, 10h24
  2. Heritage et polymorphisme
    Par mselmi dans le forum Langage
    Réponses: 2
    Dernier message: 30/06/2009, 15h44
  3. Réponses: 36
    Dernier message: 09/09/2006, 03h06
  4. Polymorphisme et heritage
    Par faico dans le forum Langage
    Réponses: 8
    Dernier message: 26/08/2006, 19h13
  5. Probleme heritage : References sur la table parente
    Par Belgar dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 03/05/2005, 22h11

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