/** * Ce programme sert à montrer le polymorphisme * en Java * @author Claude Delannoy (Programmer en Java) * @author Mohamed Lokbani (commentaires + quelques ajustements) * @version 1.2 */ /** Classe Point Elle permet d'afficher les coordonnées d'un point et d'identifier que l'objet qui fait l'appel est un point. */ class Point { private int x,y; /** Constructeur pour construire un Point @param x : coordonnée x @param y : coordonnée y */ public Point (int x, int y){ this.x = x; this.y = y; } /** Méthode permettant d'afficher que nous avons à faire à un Point, et nous informe des coordonnées de ce Point, dans l'espace x,y. */ public void affiche() { identifie(); System.out.println(" Mes coordonnées sont : " + x + " " + y); } /** Méthode permettant d'identifier que l'objet qui fait l'appel est un Point. */ public void identifie() { System.out.println("Je suis un point "); } } /** Classe Pointcol Elle représente un Point coloré. quelques points à retenir ... - Pointcol hérite les méthodes de la classe Point: affiche et identifie. - on va quand même redéfinir la méthode identifie de ce fait la méthode identifie de la classe de base va être masquée (ne sera plus accéssible à partir de la classe dérivée). - on ne définit pas la méthode affiche, nous allons donc utiliser celle de la classe de base, en cas d'appel. - les membres x et y de la classe Point ne sont pas accéssibles de la classe Pointcol car ils sont "private" dans la classe de base Point. */ class Pointcol extends Point { private byte couleur; /** Constructeur pour construire un Point coloré @param x : coordonnée x @param y : coordonnée y @param couleur : la couleur du Point */ public Pointcol (int x, int y,byte couleur){ // appel du constructeur de la classe de base super(x,y); // initilise les champs données de la classe // dérivée this.couleur = couleur; } /** Méthode permettant d'identifier que l'objet qui fait l'appel est un Point coloré. */ public void identifie() { System.out.println("Je suis un point coloré de couleur " + couleur); } } public class exo1 { public static void main (String args[]){ // on instancie un tableau de Point. Point [] tabPts = new Point[4]; // on affecte à ce tableau des références // à des objets de type Point et Pointcol tabPts[0] = new Point(0,2); tabPts[1] = new Pointcol(1,5,(byte)3); tabPts[2] = new Pointcol(2,8,(byte)9); tabPts[3] = new Point(1,2); /* on fait appel à "affiche" ... nous sommes en présence d'une seule méthode "affiche" définie dans la classe Point. Pour la classe Pointcol elle va hériter cette méthode, de ce fait elle aura elle aussi accès. Quand est-il pour "identifie" qui a été redéfinie dans la classe dérivée (Pointcol)? Polymorphisme: Même message envoyé à deux objets différents, provoque des réponses différentes! tabPts[0] & tabPts[3] font référence à des objets de type Point ; alors que tabPts[1] & tabPts[2] font référence à des objets de type Pointcol, et les 4 objets vont appeler la méthode "affiche" qui contient un appel à la méthode "identifie": Pour tabPts[0] & tabPts[3] c'est la méthode "identifie" de Point qui va être appelée, alors que pour tabPts[1] & tabPts[2] c'est la méthode "identifie" de Pointcol qui sera appelée, cela est dû à la notion de polymorphisme. Le choix de la méthode se fait donc à l'exécution et non pas à la compilation. */ for (int i=0; iinclure jdk ===>java exo1 Je suis un point Mes coordonnées sont : 0 2 Je suis un point coloré de couleur 3 Mes coordonnées sont : 1 5 Je suis un point coloré de couleur 9 Mes coordonnées sont : 2 8 Je suis un point Mes coordonnées sont : 1 2 */