super_toinou
Messages postés764Date d'inscriptionmardi 25 mai 2004StatutMembreDernière intervention 8 mars 2011
-
21 févr. 2007 à 12:01
super_toinou
Messages postés764Date d'inscriptionmardi 25 mai 2004StatutMembreDernière intervention 8 mars 2011
-
22 févr. 2007 à 10:39
Bonjour à tous,
en faisant un tour sur des exos de certification j suis tombé sur un problème et la sérieux j comprend pas (et j suis pas le seul). Est ce que quelqu'un à une explication au probleme suivant :
class SuperCafe4Java {
public Object get (Object o) {
return ("SuperCafe4Java");
}
}
class SubCafe4Java extends SuperCafe4Java {
public Object get (String o) {
return ("SubCafe4Java");
}
}
class TestCafe4Java {
public static void main (String[] arguments) {
SuperCafe4Java superFoo;
SubCafe4Java subFoo;
superFoo = new SubCafe4Java();
System.out.println (superFoo.get("super"));
Pour moi la réponse ca devrait etre
SubCafe4Java
SubCafe4Java
Mon raisonnement résumé : le 1ere coup en réalité c est un SubCafe4Java donc il appelle get("String") ca devrait matcher avec la signature de la classe SubCafe4Java donc ca devrait afficher SubCafe4Java (+ ou - meme raisonnement pour le 2ème cas)
Or en réalité ca affiche
SuperCafe4Java
SuperCafe4Java
J ai beau me triturer la tête là j trouve pas, si quelqu'un a une explication ce serait bien cool !!
Merci
++ Toinou
PS: j paye mon coup à celui qui me trouve la réponse et qui arrive à l expliquer !! :D
gmi19oj19
Messages postés545Date d'inscriptionlundi 10 mai 2004StatutMembreDernière intervention28 septembre 20112 21 févr. 2007 à 14:15
Pour le 1er test, l'affichage de SuperCafe4Java est logique vu que c'est le resultat de la seule méthode get.
Dans le second test, tu as deux methodes get, attendant respectivement un Object (méthode héritée) et un String (méthode de classe). J'aurai tendance à penser qu'il prend le type le plus général quand on passe en paramètre à une méthode un objet, ce qui explique l'utilisatin de la méthode héritée. Cependant, pourle second point, j'en suis pas certain
gmi19oj19
Messages postés545Date d'inscriptionlundi 10 mai 2004StatutMembreDernière intervention28 septembre 20112 21 févr. 2007 à 14:16
Et là je me rends compte que j'ai dit n'imp' pour le 1er cas puisque qu'on utilise le constructeur de la classe fille... M'enfin, je maintiens mon raisonnement pour la 2ème situation, qui s'appliquerait désormais à la première ^^
thevman
Messages postés83Date d'inscriptionlundi 5 septembre 2005StatutMembreDernière intervention 3 juillet 2008 21 févr. 2007 à 14:36
Je n'ai pas la réponse exact mais à mon avis la réponse viens du cast qui est effectué
subFoo = new SubCafe4Java();
superFoo = subFoo;
System.out.println (superFoo.get("super"));
En effet superFoo est du type SuperCafe4Java et on lui passe une classe du type SubCafe4Java ,
--> le passage marche parceque SubCafe4Java hérite de SuperCafe4Java ( pour faire une comparaison c'est comme qd on cast un string en Object)
Le problème c'est que SuperCafe4Java ne connait que ces méthodes donc c'est normal qu'il n'affiche que le message SuperCafe4Java.
D'ailleur pour faire le test essaye de cast un String en Object et regarde les méthode de ton objet Object (y a pas celle de String ^^)
super_toinou
Messages postés764Date d'inscriptionmardi 25 mai 2004StatutMembreDernière intervention 8 mars 20116 21 févr. 2007 à 16:41
Yopla,
merci tout le monde pour les réponses , j suis pas par tout mais apres reflexion je pense que c est shaiulud qui doit s approcher de la vérité.
Normalement la JVM appelle la méthode la plus proche de l'objet réel (ce qu explique le lien de thevman) donc je puis pas spécialement d'accord avec l analyse "il va chopper d abord les fonctions dans les super classes et apres descend s il trouve pas".
A mon avis puisque ce n'est pas la meme signature au niveau des arguments que prend la méthode c est un cas de surchage et non de redefinition de méthode ce qui fait que le polymorphisme ne peut s adapter dans ce cas. A l execution la JVM voit donc la fonction get(Object) bien qu on lui passe un String.
Pour info get((String) "toto") rend le meme résultat !
Bref merci à tous, si quelqu un pense que j ai tord n'hésitez pas à me le dire !!