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 :

Un probleme d'héritage


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Février 2007
    Messages
    406
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 406
    Par défaut Un probleme d'héritage
    bonsoir à tous,
    voici mon code:
    la classe A
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class A
    {int i=1;
    int f(){return i;}
    static char g(){return 'A';}}
    la classe B
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class B extends A
    {int i=2;
    int f() {return -i;}
    static char g(){return 'B';}}
    le main:
    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 Exe2{
    public static void main (String args[])
    {B b=new B();
    System.out.println(b.i);
    System.out.println(b.f());
    System.out.println(b.g());
    System.out.println(B.g());
     
    A a=b;
    System.out.println(a.i);
    System.out.println(a.f());
    System.out.println(a.g());
    System.out.println(A.g());}}
    les resulats sont:
    b.i=2
    b.f()=-2
    b.g()=B
    B.g()=B
    a.i=1
    a.f()=-2
    a.g()=A
    A.g()=A
    en ce qui concerne les résultats de b c'est ok, mais dés qu'il s'agit de A a=b, c'est la où je comprend pas trop les résultats,j'avais prévu un truc du genre:
    a.i=2
    a.f()=-2
    a.g()=B
    A.g()=A
    pouvez-vous m'expliquer??
    merci pr votre aide

  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
    Le fait qu'un objet soit déclaré comme un A ou un B n'a aucune importance, ce qui compte c'est l'object instancié (new XXX()).
    Pour la méthode statique g c'est un peu différent parce que les méthodes statiques ne sont pas surchargées.

  3. #3
    Membre éclairé Avatar de ploxien
    Inscrit en
    Février 2006
    Messages
    467
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Février 2006
    Messages : 467
    Par défaut
    a.i=1:
    Ton objet est de type A, i vaut donc 1!

    a.f()=-2:

    Tu appel la méthode de la classe B, et elle fait référence à son propre i, donc -2!

    a.g()=A:
    A.g()=A:
    g() est static, donc pas surchargée! tu appel toujours celle de la classe A!

    J'espère que c'est assez clair...

  4. #4
    Membre éclairé Avatar de trax44
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 300
    Par défaut
    Je suis d'accord avec iohack sur tes lacunes en polymorphisme.
    J'ajouterais aussi un petit détail, pense a toujours faire du code propre même pour des exemples même si ça n'a rien a voir avec le problème => attributs en private et tout ce qui va bien avec

  5. #5
    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,

    Ce résultat est normal !
    Seul les méthodes non-static, non-final et non-private peuvent être héritées...

    • i est un attribut, il n'est donc pas soumis à l'héritage (il existe donc bien deux attributs distincts).
    • g() est une méthode static, et ne peut donc pas être hérité...


    a++

  6. #6
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    L'explication claire et précise n'étant pas mon point fort, je vais plutôt te rediriger vers le fameux "thinking in java" : http://java.developpez.com/cours/
    "penser en java".
    Ton interrogation montre clairement que tu n'as pas assimilé la notion de "polymorphisme". Je t'invite donc à rechercher dans ce livre les passages décrivant cette notion. Si tu es vraiement débutant, je suis pas sur que ce livre soit le mieux ( un peu trop technique je pense ), donc une petite recherche google ou même sur dvp.com te donneront très certainement beaucoup de liens intéressants.

    EDIT : grilled : faire de même pour le mot-clef "static"

  7. #7
    Membre éclairé
    Inscrit en
    Février 2007
    Messages
    406
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 406
    Par défaut
    j'ai consulté plusieurs cours mais sans résultats...
    mais le prob c'est que cette expression A a=b ,elle me déstabilise!!!
    comment peut on faire ca alors ke b est de type B??
    et puis je croyais ke pour interdire l'heritage d'une classe ou la redefinition d'une methode on utilise final, mais la je vois pas trop ce que static vient faire dans l'interdiction d'héritage...
    désolé si je pose trop de questions, c'est que c'est pas claire du tt dans ma tête.
    et merci à tous ceux qui m'ont répondu

  8. #8
    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
    Citation Envoyé par ranell
    j'ai consulté plusieurs cours mais sans résultats...
    mais le prob c'est que cette expression A a=b ,elle me déstabilise!!!
    comment peut on faire ca alors ke b est de type B??
    Parce que le type B hérite de A, donc B "est une sorte de" A et peut donc être assigné à une référence de A.

    Citation Envoyé par ranell
    et puis je croyais ke pour interdire l'heritage d'une classe ou la redefinition d'une methode on utilise final,
    Oui tout à fait !

    Citation Envoyé par ranell
    mais la je vois pas trop ce que static vient faire dans l'interdiction d'héritage...
    static n'interdit pas l'héritage. static permet de définir une méthode de classe plutôt qu'une méthode d'instance. Ainsi une méthode static n'est pas lié à une instance particulière : elle est indépendante et tu ne peux donc pas la redéfinir (en fait dans ton code il y a deux méthodes individuelles).

    De plus les méthodes de classes (static) doivent toujours être appelée avec le nom de leur classe et non pas avec une référence. Ainsi dans ton code a.g() et b.g() sont faux car il faut utiliser A.g() et B.g() ! Si tu ne le fait pas le compilateur se "démerde" pour trouver la bonne méthode mais ce n'est pas très propre (certain compilateur peuvent émettre un warning dans de tel cas)


    a++

  9. #9
    Membre éclairé
    Inscrit en
    Février 2007
    Messages
    406
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 406
    Par défaut
    merci adiGuba pour les explications, j'y vois un peu plus clair, je vais essayer de trouver un peu plus sur le polymorphisme et la surcharge des méthodes...

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

Discussions similaires

  1. probleme d'héritage en java
    Par lavoiture dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 21/11/2008, 16h59
  2. [IE] Probleme d'héritage de couleur
    Par Marco85 dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 25/03/2007, 22h35
  3. probleme d'héritage
    Par bitbis dans le forum Langage
    Réponses: 6
    Dernier message: 17/02/2006, 23h09
  4. [vb.net][form] probleme avec l'héritage
    Par graphicsxp dans le forum Windows Forms
    Réponses: 2
    Dernier message: 06/10/2005, 16h01
  5. [débutant] Probleme avec switch et héritage
    Par durk dans le forum Langage
    Réponses: 2
    Dernier message: 21/04/2005, 09h48

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