Académique Documents
Professionnel Documents
Culture Documents
Il suffit de définir une classe dérivée en utilisant le mot clé extends. La méthode affiche,
comme toute méthode d’une classe dérivée a accès à tous les membres publics de la classe de
base, donc en particulier à getX et getY.
class PointA extends Point
{ void affiche()
{ System.out.println ("Coordonnees : " + getX() + " " + getY()) ;
}
}
On peut alors créer des objets de type PointA et leur appliquer aussi bien les méthodes publi-
ques de PointA que celles de Point comme dans ce programme accompagné d’un exemple
d’exécution :
public class TsPointA
{ public static void main (String args[])
{ Point p = new Point () ;
p.initialise (2, 5) ;
System.out.println ("Coordonnees : " + p.getX() + " " + p.getY() ) ;
PointA pa = new PointA () ;
pa.initialise (1, 8) ; // on utilise la methode initialise de Point
pa.affiche() ; // et la methode affiche de PointA
}
}
Coordonnees : 2 5
Coordonnees : 2 5
78 © Éditions Eyrolles
geneli~1.book Page 79 Lundi, 10. juillet 2006 12:46 12
Notez bien qu’un appel tel que p.affiche() conduirait à une erreur de compilation puisque la
classe de p (Point) ne possède pas de méthode affiche.
Si la classe Point n’avait pas disposé des méthodes d’accès getX et getY, il n’aurait pas été
possible d’accéder à ses champs privés x et y depuis la classe PointA. Il n’aurait donc pas été
possible de la doter de la méthode affiche. L’héritage ne permet pas de contourner le principe
d’encapsulation.
Comme nos classes ne disposent pas de constructeur, il est possible de créer des objets sans les
initialiser. Dans ce cas, leurs champs auront simplement une valeur "nulle", c’est-à-dire ici la
valeur entière 0.
© Éditions Eyrolles 79
geneli~1.book Page 80 Lundi, 10. juillet 2006 12:46 12
La méthode setNom est triviale. Compte tenu de l’encapsulation des données de Point, nos
deux autres méthodes doivent absolument recourir aux méthodes publiques de Point.
En définitive, voici la définition de notre classe PoitnNom :
class PointNom extends Point
{ public void setPointNom (int x, int y, char nom)
{ setPoint (x, y) ;
this.nom = nom ;
}
public void setNom(char nom)
{ this.nom = nom ;
}
public void affCoordNom()
{ System.out.print ("Point de nom " + nom + " ") ;
affCoord() ;
}
private char nom ;
}
Coordonnees : 2 5
Point de nom A Coordonnees : 1 7
Point de nom A Coordonnees : 10 10
Point de nom B Coordonnees : 4 3
Coordonnees : 4 3
80 © Éditions Eyrolles
geneli~1.book Page 81 Lundi, 10. juillet 2006 12:46 12
1. Ici encore, comme nos classes ne disposent pas de constructeur, il est possible de créer des
objets sans les initialiser. Dans ce cas, leurs champs auront simplement une valeur "nulle",
c’est-à-dire ici la valeur entière 0 pour les coordonées et le caractère de code nul pour le
nom.
2. Comme la classe Point ne dispose pas de méthodes d’accès aux coordonnées, on voit
que la méthode affCoordNom n’a pas d’autre possibilité que de recourir à la méthode
affCoord de Point, ce qui impose des contraintes sur la présentation des résultats. En
particulier, il serait impossible d’afficher sur une même ligne le nom du point avant les
coordonnées.
Cet exercice est voisin de l’exercice 61 mais, cette fois, les deux classes disposent d’un cons-
tructeur. Celui de la classe dérivée PointNom doit prendre en charge la construction de l’inté-
gralité de l’objet correspondant, quitte à s’appuyer pour cela sur le constructeur de la classe de
base (ce qui est indispensable ici puisque la classe Point ne dispose pas de méthodes d’accès).
Rappelons que l’appel du constructeur de la classe de base (fait à l’aide du mot clé super) doit
constituer la première instruction du constructeur de la classe dérivée.
© Éditions Eyrolles 81
geneli~1.book Page 82 Lundi, 10. juillet 2006 12:46 12
63 Redéfinition
On dispose de la classe suivante :
class Point
{ public Point (int x, int y) { this.x = x ; this.y = y ; }
public void affiche()
{ System.out.println ("Coordonnees : " + x + " " + y) ;
}
private int x, y ;
}
Réaliser une classe PointNom, dérivée de Point permettant de manipuler des points définis
par leurs coordonnées et un nom (caractère). On y prévoira les méthodes suivantes :
• constructeur pour définir les coordonnées et le nom d’un objet de type PointNom,
• affiche pour afficher les coordonnées et le nom d’un objet de type PointNom.
82 © Éditions Eyrolles
geneli~1.book Page 83 Lundi, 10. juillet 2006 12:46 12
Exercice 63 Redéfinition
Cet exercice est voisin de l’exercice 62. L’écriture du constructeur reste la même. Mais, cette
fois, on doit redéfinir la méthode affiche dans la classe dérivée. L’affichage du nom n’y pose
aucun problème :
System.out.print ("Point de nom " + nom + " ") ;
En revanche, il nous faut faire appel à la méthode affiche de la classe de base. Pour ce faire,
nous employons le mot clé super :
super.affiche() ;
En définitive, voici la définition de notre classe, accompagnée d’un petit programme
d’utilisation :
class PointNom extends Point
{ public PointNom (int x, int y, char Nom)
{ super (x, y) ;
this.Nom = Nom ;
}
public void affiche()
{ System.out.print ("Point de nom " + Nom + " ") ;
super.affiche() ;
}
private char Nom ;
}
public class TsPointR
{ public static void main (String args[])
{ Point p = new Point (3, 7) ;
p.affiche() ; // methode de Point
PointNom pn = new PointNom(1, 7, 'A') ;
pn.affiche() ; // methode de PointNom
}
}
Coordonnees : 3 7
Point de nom A Coordonnees : 1 7
Ici, la redéfinition de la méthode affiche dans PointNom utilise la méthode affiche de la classe
ascendante Point, ce qui impose de recourir au mot clé super. Bien entendu, il n’en ira pas
toujours ainsi : rien n’empêche de redéfinir entièrement une méthode sans chercher à exploiter
celle de la classe ascendante.
© Éditions Eyrolles 83