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 :

Débutant : Polymorphisme


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Débutant : Polymorphisme
    Bonjour,

    J'ai une question basique sur le polymorphisme en Java.

    Lors d'un cours de Java nous avons étudié l'algo suivant :

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    abstract class Nombre {
        abstract Nombre plus(Nombre b);
    }
     
    class Entier extends Nombre {
        int val;
     
        Entier(int n) {
            val = n;
        }
     
        Nombre plus(Nombre n) {
            System.out.println("plus d’Entier");
            return null;
        }
    }
     
    class Reel extends Entier {
        int denom;
     
        Reel(int n, int n2) {
            super(n);
            denom=n2;
        }
     
        Reel plus(Reel n) {
            System.out.println("plus de Reel");
            return new Reel(9, 9);
        }
    }
     
    class Exercice {
        Nombre n1;
     
        Exercice(Nombre n) {
            n1=n;
        }
     
        Nombre eval(Nombre n2) {
            return n1.plus(n2); // marque 1
        }
     
     
        public static void main(String[] args)
        {
            Nombre x1;
            x1 = new Reel(4,5);
            Nombre x2 = new Entier(5);
            Reel x3 = new Reel(1,2);
            Entier x4 = new Reel(1,8);
     
            (new Exercice(x1)).eval(x1); // marque 2
            (new Exercice(x4)).eval(x4); // marque 3
            (new Exercice(x3)).eval(x2); // marque 4
            (new Exercice(x2)).eval(x3); // marque 5
        }
    }
    La trace du programme est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    plus d’Entier
    plus d’Entier
    plus d’Entier
    plus d’Entier
    Ce que je ne comprend pas c'est qui ce passe à la ligne marque 2
    D'après ce que l'on m'a expliqué, l'identification de la méthode appelée se fait par le type de l'instance de l'objet placé en paramètre (même s’il y a un upcast).
    Ainsi dans mon cas, quand j'appelle la méthode eval d'Exercice, le paramètre est de type réel (classe dérivée de Nombre). Donc normalement, ce devrait être la méthode plus de réél qui devrait être appelé ! Mais comme vous pouvez le voir dans la trace, ça n'est pas du tout le cas !
    En débuge sur NetBean, je vois bien que lors de l'exécution de la méthode eval, le type de n1 et n2 est réel.

    Est-ce que quelqu'un pourrait m'expliquer pourquoi le programme réagit ainsi ?

    Merci d'avance à tous.

  2. #2
    Expert éminent
    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
    Points : 7 679
    Points
    7 679
    Par défaut
    Bonjour.
    Décortiquons le cas 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (new Exercice(x1)).eval(x1);
    ce qui est équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Nombre x1;
    x1 = new Reel(4,5);
    x1.eval(x1);
    Ce bout de code génère "plus d’Entier" au lieu de "plus de Reel" parce qu'il ne s'agit pas d'une redéfinition (polymorphisme), mais de la surcharge.
    En effet, x1.eval(x1) appelle la méthode Entier.eval(Entier) et ce parce que x1 est déclaré comme Entier, même s'il est instancié par un Reel.

    Je t'invites à consulter ce post pour plus de détails :
    http://www.developpez.net/forums/sho...5&postcount=13

    Et aussi :

    - Les cours et tutoriels pour apprendre Java : http://java.developpez.com/cours/
    - Le cours Java de jmdoudou : http://jmdoudoux.developpez.com/cours/developpons/java/


    Bonne chance.

  3. #3
    Candidat au Club
    Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Salut,

    Merci pour tes explications !!!!!!!

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

Discussions similaires

  1. [débutant] Question sur le polymorphisme
    Par coyotte507 dans le forum C++
    Réponses: 12
    Dernier message: 25/02/2007, 14h10
  2. Réponses: 4
    Dernier message: 25/01/2007, 21h11
  3. [Héritage] [Polymorphisme] Question de débutant ?
    Par TSnarfK dans le forum Langage
    Réponses: 9
    Dernier message: 12/09/2006, 15h39
  4. débutant java Polymorphisme
    Par Bba_M dans le forum Langage
    Réponses: 8
    Dernier message: 12/06/2006, 09h39
  5. Réponses: 2
    Dernier message: 25/07/2004, 23h24

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