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] Question de cours de JAVA [FAQ]


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 31
    Points : 18
    Points
    18
    Par défaut [Débutant] Question de cours de JAVA
    Bonjour à tous,

    J'ai une petite question concernant le Java mais ce n'est pas un problème de code, c'est plus un éclaircissement sur le langage...et comme je suis une débutante, j'ose poser ma question même si elle peut paraître simple ou débile.


    J'ai :

    une classe A contenant les méthodes m1() et m2(D)
    une classe B contenant la méthode m1(int)
    une classe C contenant la méthode m2(D)

    les classes B et C héritent de A

    une classe D contenant les méthodes m1() et m3(A)
    une classe E contenant la méthode m3(B)

    la classe E hérite de D

    On me propose de faire :

    d = e; //d instance de d et e instance de e
    d.m3(a); //fonctionne
    d.m3(b);//ne fonctionne pas
    d.m3(c);//ne fonctionne pas

    Je voulais savoir ce que veut dire d=e ?
    Et pourquoi la méthode m3(b) ne marche t-elle plus ?
    Merci de vos réponses éclairantes, je suis un peu perdue !

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    Citation Envoyé par pinggu
    d.m3(b);//ne fonctionne pas
    d.m3(c);//ne fonctionne pas
    C'est à dire ? tu as des messages d'erreurs ? ça ne fait ou ne renvoie pas ce tu attends ?

  3. #3
    Membre éclairé Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Points : 683
    Points
    683
    Par défaut
    Citation Envoyé par pinggu
    Je voulais savoir ce que veut dire d=e ?
    Et pourquoi la méthode m3(b) ne marche t-elle plus ?
    "d=e" signifie que l'instance de D prend pour valeur l'instance de E (qui est aussi une instance de D entre-autre) : au final "d" sera remplacé par "e" mais en tant qu'instance de D, pas en tant qu'instance de E.

    Ainsi "m3(A)" fonctionne mais pas "m3(B)", car "d" a désormais pour valeur "e" en tant qu'instance de D, qui possède la méthode pour la classe A en paramètre mais pas pour la classe B (elle se trouve dans E).

    Idem pour le problème de "m3(C)" qui n'existe nul part ; il faudrait pour que ça fonctionne <<caster>> ton instance "c" en B (ce qui aurait pour effet de considérer "c" uniquement en B, mais pas en C qui est un B hérité) : comme par exemple...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    d.m3((B)c); // fonctionne

  4. #4
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Salut,
    d = e; //d instance de d et e instance de e
    Tu référencie l'objet e sur la référence d. En clair, tu as une référence d qui "pointe" sur un objet D je suppose (compares ca à un doigt qui montre l'objet). Eh bien faire
    revient à déplacer ce doigt sur l'objet référencé par e (un objet E je suppose). Or E hérite de D, donc j'ai tout à fait le droit. C'est un des avantage de l'héritage.
    d.m3(a); //fonctionne
    m3(A) est une fonction définie dans la classe D. D possède la fonction m3(A). Donc E, qui hérite de D, la possède aussi.

    d.m3(b);//ne fonctionne pas
    D ne possede pas de methode m3(B), donc E n'en possède pas non plus. Il ne faut pas confondre, même si les fontions ont le même nom, elles n'ont pas les mêmes paramètres, ce qui les différencie. C'est comme 2 personnes qui s'appellent Bob, mais qui n'ont pas les mêmes caractéristiques. /!\

    d.m3(c);//ne fonctionne pas
    Même raisonnement que pour d.m3(b); ...

    Voilà j'espère avoir éclairé ta lanterne !!

    mavina

  5. #5
    Membre éclairé Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Points : 683
    Points
    683
    Par défaut
    Citation Envoyé par mavina
    D ne possede pas de methode m3(B), donc E n'en possède pas non plus.
    Attention, il faut lire "D ne possede pas de methode m3(B), donc e en tant que D n'en possède pas non plus" : car << une classe E contenant la méthode m3(B) >> était écrit ...

  6. #6
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 31
    Points : 18
    Points
    18
    Par défaut
    Ma lanterne est plus qu'éclairée, merci de vos précieuses infos. Je comprends mieux le mécanisme maintenant !

  7. #7
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    D ne possède pas de méthode m3(B) mais possède une méthode m3(A).
    Or B hérite de A donc il me semble que le polymorphisme induit que d.m3(b) ne devrait pas poser de problème, non ?

  8. #8
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    En effet il y a un effet pervers, E définit une fonction m3(B), et B hérite de A, laquelle prendre ? ^^
    Je teste et je vous dit quoi
    edit:Apres test, il prend la fonction de E, donc normalement d.m3(B) devrait marcher ...

    mavina

  9. #9
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Points : 1 635
    Points
    1 635
    Par défaut
    D ne possède pas de méthode m3(B) mais possède une méthode m3(A).
    Or B hérite de A donc il me semble que le polymorphisme induit que d.m3(b) ne devrait pas poser de problème, non ?
    Je suis d'accord avec toi. Même si l'énoncé de départ est un peu fouillis

  10. #10
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Points : 1 635
    Points
    1 635
    Par défaut
    En effet il y a un effet pervers, E définit une fonction m3(B), et B hérite de A, laquelle prendre ? ^^
    Je teste et je vous dit quoi
    Pas besoin de tester :

    d.m3(b)
    va exécuter la méthode contenue dans e (dernière classe de la hiérarchie).

  11. #11
    Membre expérimenté
    Avatar de Juju_41
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2003
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Février 2003
    Messages : 974
    Points : 1 557
    Points
    1 557
    Par défaut
    Bonjour,

    Si j'ai bien compris, le diagramme de classe ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        ---------              ---------
        |   A   |              |   D   |
        ---------              ---------
        | m1()  |              | m1()  |
      ->| m2(D) |<--           | m3(A) |<-
      | ---------  |           --------- |
      |            |                     |
      |            |                     |
    -----------  ---------             ---------
    |    B    |  |   C   |             |   E   |
    -----------  ---------             ---------
    | m1(int) |  | m2(D) |             | m3(B) |
    -----------  ---------             ---------
    Je suppose également que a, b, c, d et e sont déclarées comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    A a = new A();
    B b = new B();
    C c = new C();
    D d = new D();
    E e = new E();
    Je ne comprends pas pourquoi celà ne fonctionne pas car cela devrait fonctionner
    Je m'explique :

    Indique que d référencera l'objet e. Celà ne pose pas de problèmes car la classe E hérite de la classe D.


    Fonctionne car la classe D contient la méthode ayant pour signature m3(A)


    Passe à la compilation car la classe D implémente la méthode ayant pour signature m3(A) et b est de type A car la classe B hérite de la classe A.


    Passe à la compilation car la classe D implémente la méthode ayant pour signature m3(A) et c est de type A car la classe C hérite de la classe A.

    Pourvez-vous expliquer mieux le "fonctionne pas" ?

  12. #12
    Membre expérimenté
    Avatar de Juju_41
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2003
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Février 2003
    Messages : 974
    Points : 1 557
    Points
    1 557
    Par défaut
    Citation Envoyé par yann2
    Pas besoin de tester :

    d.m3(b)
    va exécuter la méthode contenue dans e (dernière classe de la hiérarchie).
    Non, vu que d est déclaré de type D il va exécuter la méthode m3 contenue dans D.
    Pour exécuter celle dans E, il faut caster :
    Pour mieux comprendre, lire les cours et tutoriels pour apprendre Java : http://java.developpez.com/cours/

  13. #13
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Points : 1 635
    Points
    1 635
    Par défaut
    Non, vu que d est déclaré de type D il va exécuter la méthode m3 contenue dans D.
    Pour exécuter celle dans E, il faut caster :


    Tu as raison. Les deux méthodes m3(A) et m3(B) sont différentes du fait de leurs signatures.

    Mais ça devrait quand même fonctionner.

  14. #14
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    J'ai fait un petit test et a priori ça marche.
    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
    public class Test {
     
        class A {
            public void m1(A a) {
                System.out.println("A.m1()");
            }
            public void m2(D d) {
                System.out.println("A.m2(D)");
            }
        }
        class B extends A{
            public void m1(int i) {
                System.out.println("B.m1(in)");
            }
        }
        class C extends A {
            public void m2(D d) {
                System.out.println("C.m2(D)");
            }
        }
        class D {
            public void m3(A a) {
                System.out.println("D.m3(A)");
            }
        }
        class E extends D {
            public void m3(B b) {
                System.out.println("E.m3(B)");
            }
        }
     
        public Test() {
            A a = new A();
            B b = new B();
            C c = new C();
            D d = new D();
            E e = new E();
     
            d = e;
            d.m3(a);
            d.m3(b);
            d.m3(c);
        }
     
        static public void main(String ...args) {
            new Test();
        }
     
    }
    cela donne :
    D.m3(A)
    D.m3(A)
    D.m3(A)
    Donc pinggu, peus tu nous en dire plus sur ce qui ne marche pas (si tu as des messages d'erreur post les) et sinon montre nous ton code.

  15. #15
    Membre éclairé Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Points : 683
    Points
    683
    Par défaut
    Ca sent l'erreur dans le cours (tout simplement)...

  16. #16
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Citation Envoyé par Juju_41
    Non, vu que d est déclaré de type D il va exécuter la méthode m3 contenue dans D.
    Pour exécuter celle dans E, il faut caster :
    Négatif, tu n'as qu'à tester
    Il n'y a pas besoin de caster, le polymorphisme se charge d'aller chercher tout seul la méthodes la moins "générique", c'est à dire celle qui est définie au plus bas dans l'arbre des classes

    mavina

  17. #17
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Points : 1 635
    Points
    1 635
    Par défaut
    Négatif, tu n'as qu'à tester
    Il n'y a pas besoin de caster, le polymorphisme se charge d'aller chercher tout seul la méthodes la moins "générique", c'est à dire celle qui est définie au plus bas dans l'arbre des classes
    Ben je pensais ça aussi ! J'ai fais un test et il s'est avéré que juju_41 a raison.


    Les deux méthodes m3(Object) et m3(String) ont une signature différente Il ne peut donc y avoir mécanisme de polymorphisme.

  18. #18
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Salut,

    Ah oui en effet, je me suis trompé .

    Pardonnez moi

    Mais quand tu y pense, si tu passe un Integer et qu'il existe une methode m3(Integer) dans E et une methode m3(Object) dans D, ce n'est pas logique qu'il (le compilateur) appelle la methode dans D et non celle dans E en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    D d=new E();
    d.maMethode(new Integer(10));
    ... :\

    mavina

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

Discussions similaires

  1. [Débutant] Questions de base sur java
    Par JajaY dans le forum Langage
    Réponses: 2
    Dernier message: 04/04/2006, 18h51
  2. [débutant]ou mettre un fichier java pour une appli jsp?
    Par zozolh2 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 11/05/2004, 15h20
  3. [débutant] question sur les #
    Par Ultros dans le forum C
    Réponses: 3
    Dernier message: 29/04/2004, 12h30
  4. PL/Sql Débutant question
    Par Guld dans le forum Langage SQL
    Réponses: 2
    Dernier message: 22/02/2004, 17h48
  5. [LG]J'ai honte : question de cours sur les paramètres
    Par letibdesneiges dans le forum Langage
    Réponses: 14
    Dernier message: 17/01/2004, 13h57

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