Académique Documents
Professionnel Documents
Culture Documents
Héritage
Dr. T.HAJJI
Ch. IV. Héritage
L'héritage est une notion fondamentale en Java
et de manière générale dans les langages de
programmation par Objets.
Sortie:
Classe de Base : 14
Classe dérivée1: 7 , 7
Classe dérivée2: 7
Exemples des cas possibles:
Exemple 1:
class ClasseDeBase{
ClasseDeBase(arguments) {
…
}
…
}
class ClasseDerivee extends ClasseDeBase {
// Pas de constructeur
….
}
On obtient une erreur de compilation. Un constructeur de la classe
dérivée doit être défini est qui doit appeler le constructeur de la
classe de base.
Exemple2:
class ClasseDeBase{
ClasseDeBase(arguments) { // constructeur de la classe de
base
…
}
}
class ClasseDerivee extends ClasseDeBase {
ClasseDerivee(arguments) { // constructeur de la classe de
base
// l’appel de super () est obligatoire sinon une erreur
….
}
}
Exemple 3:
class ClasseDeBase{
ClasseDeBase(arguments) { // constructeur de la classe de base
…
}
ClasseDeBase() { // constructeur sans paramètre de la classe de
base
…
}
}
class ClasseDerivee extends ClasseDeBase {
ClasseDerivee(arguments) {// constructeur de la classe
dérivée
// l’appel de super () n’est pas obligatoire.
// si super() n’est pas appelé explicitement,
// le constructeur par défaut de ClasseDeBase est appelé
….
}
}
Exemple 4:
class ClasseDeBase{
// Pas de constructeur
…
}
class ClasseDerivee extends ClasseDeBase {
// Pas de constructeur
….
}
Sortie:
Classe de Base :
Classe dérivée1:
Classe dérivée2:
Résumé:
Si on n'appelle pas le constructeur de la
super-classe, le constructeur par défaut est
utilisé si:
- aucun constructeur n’est défini
- au moins un constructeur sans paramètre
est défini
sinon le compilateur déclare une erreur
Notion de la Redéfinition
Class A: méthode de A
B
C* Classe B: méthode de A
Classe D: méthode de D
Classe E: méthode de A
Classe C: méthode de C
E Classe F: méthode de C
D* F
- la redéfinition d'une méthode d'une classe consiste à
fournir dans une sous-classe une nouvelle
implémentation de la méthode. Cette nouvelle
implémentation masque alors complètement celle de la
super-classe
class A {
public void f(){
System.out.println("Methode f(): Classe de base A");
}
public void g(){
System.out.println("Methode g(): Classe de base A");
}
}
class B extends A {
public void f(){
System.out.println("Methode f(): Classe B derivee de A");
public void h(){
System.out.println("Methode h(): Classe B derivee de A");
}
}
A a=new A(); B b = new B();
a.f(); // appelle la méthode définie dans A
a=b; // A a = new(B);
a.f(); // appelle la méthode définie dans B
a.g(); // appelle la méthode définie dans A
b.g(); // appelle la méthode définie dans A
Soit B une classe qui hérite de la classe A, et soit f() une méthode
définie dans A et redéfinie dans B. Si on a:
A a = new B();
a.f();
Alors la méthode f() appelée est celle définie dans B.
Exemple
Considérons une classe FormeGeometrique.
Supposons que les classes Rectangle et Cercle
héritent de la super classe FormeGeometrique. Dans
un tableau hétérogène, on ranges des objets de type
Rectangle, Cercle. Ensuite on affiche le contenu du
tableau
Exemple
class FormeGeometrique {
public void dessineRectangle() {} // méthode vide
public void dessineCercle() {} // méthode vide
}
class Rectangle extends FormeGeometrique {
public void dessineRectangle() {
System.out.println("Je suis un rectangle ");
}
}
class Cercle extends FormeGeometrique {
public void dessineCercle() {
System.out.println("Je suis un cercle .... ");
}
}
public class TestFigPoly {
public static void main(String[] args) {
FormeGeometrique [] figures = new
FormeGeometrique[3];
figures[0]=new Rectangle();
figures[1]=new Cercle();
figures[2]=new Cercle();
for (int i=0; i < figures.length; i++) {
if (figures[i] instanceof Rectangle)
figures[i].dessineRectangle();
else if (figures[i] instanceof Cercle)
figures[i].dessineCercle();
}
}
}
instanceof: Soit b est une instance d'une classe B alors (b instanceof
A) retourne true si B est une sous classe de A. En particulier (b
instanceof B) retourne true.
Inconvénients dans le code précédent:
1. Si on veut rajouter une nouvelle forme
géométrique par exemple, triangle alors on est
obliger de:
- changer dans le code source aux niveaux définition de la
classe (rajouter la méthode vide public void
dessineTriangle() {})
- Rajouter un branchement pour la forme Triangle
2. Si on traite plusieurs formes géométrique, alors le
code comportera plusieurs tests.
class FormeFigure {
public FormeFigure(int x, int y) { // constructeur
this.x=x; this.y=y;
}
public void dessineFigure() {
afficheMonIdentite();
System.out.println(" ma position dans le plan est (" + x + " ," + y +
")" );
}
public void afficheMonIdentite(){}; // méthode vide
private int x,y;
}
class Rectangle extends FormeFigure {
public Rectangle(int x, int y, int longueur, int largeur) { // centre (x,y)
super(x,y);
this.largeur=largeur; this.longueur=longueur;
}
public void afficheMonIdentite() {
System.out.println(" Je suis un Rectangle de longueur " +longueur +" et de largeur " +
largeur);
}
private int largeur, int longueur;
}
class Cercle extends FormeFigure {
public Cercle(int x, int y, int rayon){ // centre (x,y)
super(x,y);
this.rayon=rayon;
}
public void afficheMonIdentite() {
System.out.println(" Je suis un cercle de Rayon " + rayon);
}
private int rayon;
}
public class TestFigPolySuite {
public static void main(String[] args) {
FormeFigure [] figures = new FormeFigure[2];
figures[0]=new Rectangle(1,2,15,6);
figures[1]=new Cercle(0,0,4);
for (int i=0; i < figures.length; i++)
figures[i].dessineFigure();
// la méthode afficheMonIdentite() appelée est celle définie dans la
classe
//réelle de l’objet et non celle définie dans la classe de déclaration
}
}
Cast (transtypage): conversions de classes
• Le « cast » est le fait de forcer le compilateur à
considérer un objet comme étant d’un type qui
n’est pas le type déclaré ou réel de l’objet
• Exemple :
FormeFigure a = new FormeFigure();
Rectangle r = (Rectangle) a;
FormeFigure b;
(Rectangle) b = r;
UpCast : classe fille → classe mère