Polymorphie java (methodes et attributs)

Fermé
willmonk Messages postés 1 Date d'inscription jeudi 19 juin 2008 Statut Membre Dernière intervention 19 juin 2008 - 19 juin 2008 à 13:15
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 - 19 juin 2008 à 22:01
Bonjour, et merci deja a tous
voila j'ai un probleme en programmation et precisement en lagage java.
J'ai le code suivant:

public class A {
int val = 13;
int method() {
return val;
}
}

public class B extends A {
int val = 42;
int method() {
return val + 3;
}
public static void main(String[] args) {
A d = new A();
B e = new B();
A f = e;
A g = (A) e;
System.out.println("1: "+d.val+" / "+d.method());
System.out.println("2: "+e.val+" / "+e.method());
System.out.println("3: "+f.val+" / "+f.method());
System.out.println("4: "+g.val+" / "+g.method());
System.out.println("5: "+((B)g).val+" / "+((B)g).method());
}
}

et je m'attendais a obtenir les resultats suivants:

1: 13/13
2: 42/45
3: 13/16
4: 13/16
5: 42/45

mais j'obtient plutot les resultats suivants:

1: 13/13
2: 42/45
3: 13/45
4: 13/45
5: 42/45

Quelqu'un pourrait il s'il vous plait m'expliquer pourquoi j'obtient ces resultats ?
Merci !!!!

W.
A voir également:

2 réponses

Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 329
19 juin 2008 à 22:01
Bonsoir,
Ton exercice est très intéressant. C'est exactement ce qu'il faut pour comprendre le polymorphisme.
En ce qui concerne les attributs, ce n'est pas très compliqué : c'est l'attribut de la classe qui transporte ton instance qui est utilisé. Ainsi si tu as :
A a = new A();
A b = new B();
A c = (A) new B();
c'est l'attribut de A qui est utilisé, et lorsque tu manipules une instance de B directement, c'est l'attribut de B.
En pratique on a très rarement le problème car la plupart des attributs sont définis en private, comme ça on ne peut y accéder que depuis la classe et on ne se pose pas de question.

En ce qui concerne les méthodes d'instance par contre, tu as pu te rendre compte que c'est la méthode de l'objet transporté et non pas du transporteur qui est utilisée. Ca s'appelle du late binding (ou liaison dynamique) ce qui veut dire que c'est la machine virtuelle qui va déterminer quelle méthode appeler lors de l'exécution et non pas lors de la compilation.
Attention cependant, j'ai bien dit que ceci concernait la surcharge de méthode d'instance! En ce qui concerne les méthodes de classe (méthodes static), c'est toujours la méthode du transporteur qui est utilisée, car tu n'est pas obligé d'instancier ta classe pour utiliser ses méthodes, et par conséquent ça signifie qu'avant même de lancer l'exécution, la jvm connait déjà les méthodes de classe (ceci est donc fait à la compilation et non pas à l'exécution).

Cordialement
5
mich62120 Messages postés 631 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 21 janvier 2010 6
19 juin 2008 à 13:23
Salut

Je pense que la convertion de classe comme tu le fait n'agit que sur les arguments et non sur les methodes.
Ou alors il faut essayer de les appeler différementl'une de l'autre:

A g =(A)e;

g.methodA();

C'est une proposition, il n'y a rien de sur je commence le java depuis peu.

Mich
0