Demande d'explications sur le choix de la meilleure (et unique) méthode
Bonjour,
Voici un exercice tiré du livre "Exercices en Java" de Claude Delannoy (Editions Eyrolles) et pour ceux qui ont le livre, il s'agit de l'exercice n°66 "dérivations successives et surdéfinition".
... (je cite le livre)
Quels résultats fournit le programme suivant :
Code:
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
| class A
{ public void f(double x) { System.out.print ("A.f(double=" + x +")" ; } }
class B extends A {}
class C extends A
{ public void f(long q) { System.out.print ("C.f(long=" + q + ") " ; } }
class D extends C
{public void f(int n){System.out.print("D.f(int="+n+")");} }
class E extends B {}
class F extends C
{ public void f(float x){ System.out.print("F.f(float="+x+")");}
public void f(int n){ System.out.print("F.f(int="+n+")");} }
public class Surdf {
/**
* @param args
*/
public static void main(String[] args) {
byte bb=1; short p=2; int n=3; long q=4; float x=5.f; double y=6.;
A a = new A(); a.f(bb); a.f(x); System.out.println();
B b = new B(); b.f(bb); a.f(x); System.out.println();
C c = new C(); c.f(bb); c.f(q); c.f(x); System.out.println();
D d = new D(); d.f(bb); c.f(q); c.f(y); System.out.println();
E e = new E(); e.f(bb); e.f(q); e.f(y); System.out.println();
F f = new F(); f.f(bb); f.f(n); f.f(x); f.f(y); f.f(p); System.out.println();
}
} |
le résultat obtenu est :
Code:
1 2 3 4 5 6
| A.f(double=1.0)A.f(double=5.0)
A.f(double=1.0)A.f(double=5.0)
C.f(long=1)C.f(long=4)A.f(double=5.0)
D.f(int=1)C.f(long=4)A.f(double=6.0)
A.f(double=1.0)A.f(double=4.0)A.f(double=6.0)
F.f(int=1)F.f(int=3)F.f(float=5.0)A.f(double=6.0)F.f(int=2) |
l'Auteur précise : ...
Ici, on fait intervenir à la fois la redéfinition d’une méthode et sa surdéfinition. Pour résoudre un appel de la forme o.f(v) (o étant un objet et v une expression), on recherche toutes les méthodes acceptables, à la fois dans la classe de o et dans toutes ses ascendantes. On utilise ensuite les règles habituelles de recherche de la meilleure (et unique) méthode. En définitive, le programme fournit les résultats suivants (notez que certaines conversions peuvent apparaître) :
... (fin de citation du livre)
Qui pourrait expliquer (simplement :-) les critères qui ont déterminé le choix de la meilleure méthode pour chaque ligne de code ?
Sans en être sur, je suppose qu'il doit s’agir d'un problème d'affectation sans perte d'information ... mais je n'ai trouvé aucun tutoriel ou article sur ce sujet précis ou j'ai mal cherché ;-).
Merci pour vos commentaires et explications.
Cordialement.
1 pièce(s) jointe(s)
les classes Java dans un fichier zip
Bonjour,
Merci pour les réponses, désolé pour les erreurs et voici l'exercice en fichier joint Pièce jointe 180861 exporté sous Eclipse (donc qui fonctionne :-).
Je me permets de rappeler les définitions suivantes pour aider à la compréhension du terme "du plus proche type SUPERIEUR" pour les débutants qui liront ce post.
Types primitifs de Java Type Description (tiré du livre les cahiers du programmeur Java 1.4 et 5.0 de Emmanuel Puybaret (Editions eyrolles) un peu vieux mais encore vrai, je pense :-)
byte : entier signé sur 8 bits (valeurs de – 128 à 127)
short : entier signé sur 16 bits (valeurs de – 32 768 à 32 767)
int : entier signé sur 32 bits (valeurs de – 2 147 483 648 à 2 147483 647)
long : entier signé sur 64 bits (valeurs de – 9 223 372036 854 775808 à 9 223 372 036 854 775 807)
float : décimal à virgule flottante sur 32 bits (valeurs de ± 10-45 à ± 1038 environ)
double : décimal à virgule flottante sur 64 bits (valeurs de ± 10-323 à ±10308 environ)
char : code Unicode sur 16 bits (peut être utilisé aussi comme entier non signé)
valeur booléenne (vrai ou fausse)
Cordialement