question 3
Lorsqu'on exécute initialement la méthode main(), les deux dernières lignes qui s'affichent dans la console sont :
Seg1 [Segment: ep1=anonymous [MobilePoint (x = 2, y = 5)], ep2=anonymous [MobilePoint (x = 1, y = 8)]]
Seg1 [Segment: ep1=A [MobilePoint (x = 2, y = 5)], ep2=B [MobilePoint (x = 1, y = 8)]]
Elles correspondent aux instructions :
System.out.println(sgmt.toString());
sgmt.getEndPoint1().setObjName("A");
sgmt.getEndPoint2().setObjName("B");
System.out.println(sgmt.toString());
qui invoquent la métode toString() de la classe Segment.
Si on commente la méthode toString() de cette classe, on obtient l'affichage suivant à la place :
Seg1 [GeomObj]
Seg1 [GeomObj]
Il s'agit de l'affichage produit par l'exécution de la méthode toString() de la classe GeomObject.
Dans les deux cas (avec ou sans commentaires), la classe Segment hérite de la classe GeomObject, donc de ses membres et méthodes.
La méthode toString() de la classe Segment redéfinit celle de la classe GeomObject.
C'est cette méthode redéfinie qui s'exécute lorsqu'on invoque toString() sur une instance de Segment.
Mais lorsqu'elle est commentée, c'est la méthode héritée de GeomObject qui s'exécute.
Note : si vous tentez à nouveau l'expérience en laissant la méthode toString() de Segment commentée,
et que vous commentez également la méthode toString() de la classe GeomObject, que se passe-t-il ?
Logiquement, on invoque une méthode qui n'existe ni dans Segment, ni dans sa classe mère GeomObject.
Cela devrait donc provoquer une erreur (The method toString() is undefined for the type Segment)
et Eclipse ne devrait même pas permettre d'exécuter la méthode main().
Ce n'est pas le cas. Non seulement, aucune erreur n'est signalée,
mais la méthode toString() produit une chaîne de caractère, du type "sajous.litl.geom.Segment@49476842".
Explication : il existe en Java un classe Object dont hérite implicitement toute classe que vous créez,
si vous ne la faites pas dériver d'une autre classe (par le mot-clé extends). Voir le cours sur la classe Object.
Dans cette classe est définie la méthode dont la signature est :
public String toString()
On peut donc invoquer toString () sur tout objet Java.
Si la méthode est redéfinie (comme c'est le cas initialement pour Segment),
c'est la méthode redéfinie qui s'exécute. Sinon, c'est celle de la classe Object.
Vous pouvez consulter la documentation de la classe Object de l'API : cherchez la class Object (sans italique) dans l'onglet en bas à gauche.