Bonjour,
J'ai une question basique sur le polymorphisme en Java.
Lors d'un cours de Java nous avons étudié l'algo suivant :
La trace du programme est la suivante :
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 dEntier"); 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 } }
Ce que je ne comprend pas c'est qui ce passe à la ligne marque 2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 plus dEntier plus dEntier plus dEntier plus dEntier
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.
Partager