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 :

Héritage de méthodes


Sujet :

Langage Java

  1. #1
    lvr
    lvr est déconnecté
    Membre extrêmement actif Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    909
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 909
    Points : 1 360
    Points
    1 360
    Par défaut Héritage de méthodes
    Bonjour,

    Voici un petit exemple de ce qui me pose problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class A {
       public void M1() { M2(); }
       public void M2() { }
    }
     
    class B extends A {
       public void M1() { super.M1(); }
       public void M2() { super.M2(); }
    }
     
    B b=new B();
    b.M1();
    A partir de là je ne comprends pas ce qui se passe.
    En trace je vois que la séquence d'appel est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    B-M1() -> A-M1() -> A-M2()
    Je me serais attendu à avoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    B-M1() -> A-M1() -> B-M2() -> A-M2()
    Quelqu'un peut me dire pourquoi est-ce que la méthode M2() de la classe B n'est pas appellée et comment faire pour qu'elle le soit ?

    Merci,

    Laurent

  2. #2
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Es-tu sûr de tes traces ? Parce que j'obtiens bien le second résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    B.M1()
    A.M1()
    B.M2()
    A.M2()
    a++

  3. #3
    Invité
    Invité(e)
    Par défaut
    Je peux me tromper mais, avec le code fournit, je m'attendrais plutôt au résultat 1.

    En effet quand B.M1 est appelée, elle appelle super.M1, donc A.M1.

    A son tour A.M1 fait un appel à M2, qui n'est autre que A.M2.

    Donc j'obtiens bien la trace B.M1 -> A.M1 -> A.M2.

    Pour avoir B.M1 -> A.M1 -> B.M2 -> A.M2 il faudrait que A.M1 connaisse sa propre sous-classe, B. Ce qui est impossible.

  4. #4
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kei2906 Voir le message
    A son tour A.M1 fait un appel à M2, qui n'est autre que A.M2.
    Non puisque l'appel de méthode est virtuelle et est déterminé à l'exécution. Comme la méthode est redéfinie dans la classe fille et c'est donc la redéfinition de méthode qui est appelée.


    Citation Envoyé par kei2906 Voir le message
    Pour avoir B.M1 -> A.M1 -> B.M2 -> A.M2 il faudrait que A.M1 connaisse sa propre sous-classe, B. Ce qui est impossible.
    C'est possible puisque la méthode à appeler est déterminée à l'exécution...

    Pour vérifier il te suffit d'exécuter ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class A {
    	public void M1() { System.out.println("A.M1()"); M2(); }
    	public void M2() { System.out.println("A.M2()"); }
    }
     
    class B extends A {
    	public void M1() { System.out.println("B.M1()"); super.M1(); }
    	public void M2() { System.out.println("B.M2()"); super.M2(); }
     
    	public static void main(String[] args) {
    		new B().M1();
    	}
    }
    a++

  5. #5
    Invité
    Invité(e)
    Par défaut
    Exact, excuse-moi.

    Je m'étais un peu embrouillé. Conceptuellement parlant je trouve ça qu'à moitié logique mais bon... La JVM a toujours le dernier mot

  6. #6
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kei2906 Voir le message
    Conceptuellement parlant je trouve ça qu'à moitié logique mais bon...
    Pourtant c'est toute la force de l'héritage !

    a++

  7. #7
    En attente de confirmation mail

    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 766
    Points : 1 267
    Points
    1 267
    Par défaut
    C'est un problème qui sent bon la rentrée des classes , voire les rattrapages de Septembre

  8. #8
    Membre chevronné
    Profil pro
    MOA
    Inscrit en
    Décembre 2002
    Messages
    1 023
    Détails du profil
    Informations personnelles :
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : MOA

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 023
    Points : 1 785
    Points
    1 785
    Par défaut
    merci beaucoup pour ce post, ca permet de revoir certaines notions.

    On se construit un objet B.
    La méthode, de l'objet B, B.M1, nous demande d'executer la méthode A.M1 qui elle nous demande d'appeler la méthode M2. Mais comme nous avons creer un objet B, on ne reste pas dans la super classe mais on execute la méthode M2 de la classe B.


    nicorama > c'est un bon problème pour la rentrée des classes

  9. #9
    lvr
    lvr est déconnecté
    Membre extrêmement actif Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    909
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 909
    Points : 1 360
    Points
    1 360
    Par défaut
    Merci pour vos interventions, je révérifie ça. Ca me semble en effet logique !!

  10. #10
    lvr
    lvr est déconnecté
    Membre extrêmement actif Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    909
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 909
    Points : 1 360
    Points
    1 360
    Par défaut
    OK. Résolu. Merci.

    J'avais un problème de scope des méthodes M2. Dans A elle était en niveau package et dans B en public tout en n'étant pas dans le même package.

    J'ai tout mis en public, et ça fonctionne.

    Laurent

  11. #11
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lvr Voir le message
    Dans A elle était en niveau package et dans B en public tout en n'étant pas dans le même package.
    Dans ce cas il n'y a pas de notion d'héritage entre les deux méthodes (c'est facilement vérifiable avec l'annotation @Override) puisque la méthode de la classe parente n'est pas visible par la classe fille...

    Par contre je n'aurais pas pensé que cela ait un tel comportement (j'aurais plutôt misé sur une erreur de compilation).

    Intéressant

    a++

  12. #12
    Membre chevronné
    Profil pro
    MOA
    Inscrit en
    Décembre 2002
    Messages
    1 023
    Détails du profil
    Informations personnelles :
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : MOA

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 023
    Points : 1 785
    Points
    1 785
    Par défaut
    adiGuba, supposons que les 2 classes soit dans le meme package.

    Si la méthode M2 dans la classe fille (classe B) n'avait pas été redefinie, peux tu me confirmer que l'appel dans la super classe :

    public void M1() { System.out.println("A.M1()"); M2(); }

    aurait causé une erreur ?

  13. #13
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par weed Voir le message
    Si la méthode M2 dans la classe fille (classe B) n'avait pas été redefinie, peux tu me confirmer que l'appel dans la super classe :

    public void M1() { System.out.println("A.M1()"); M2(); }

    aurait causé une erreur ?
    Pourquoi cela devrait-il causer une erreur ?

    a++

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

Discussions similaires

  1. Héritage et méthodes
    Par lamoua76 dans le forum Langage
    Réponses: 7
    Dernier message: 07/12/2007, 18h27
  2. héritage et méthode abstraite
    Par troussepoil dans le forum C++
    Réponses: 13
    Dernier message: 30/03/2007, 09h51
  3. Exceptions, héritage et méthodes virtuelles
    Par Nuwanda dans le forum C++
    Réponses: 13
    Dernier message: 23/05/2006, 12h06
  4. Réponses: 8
    Dernier message: 04/06/2004, 09h13
  5. [Héritage] Redéfinition méthode
    Par petit-ourson dans le forum Langage
    Réponses: 9
    Dernier message: 06/05/2004, 16h06

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