• 15 heures
  • Facile

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 19/05/2021

Spécialisez vos classes avec l’héritage et le polymorphisme

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Dans le chapitre précédent, nous nous sommes intéressés à la notion de type complexe, et vous avez écrit et instancié votre première classe ! Dans ce chapitre, nous allons aborder des concepts fondamentaux de la programmation orientée objet en spécialisant nos classes.

Notez bien que la notion de classe (à la base de la programmation orientée objet (POO)) repose sur un principe de généralisation : on essaie de tout regrouper dans “le même sac”. 🎒 Pour autant, on a ensuite besoin de décliner une classe selon des cas plus particuliers, et c’est là qu’intervient la spécialisation

Spécialisez une classe grâce à l’héritage

Prenons une classe qui sera notre socle commun. C’est la classe mère. L'héritage permet de créer des classes filles qui reprendront les mêmes attributs et méthodes que cette classe mère. Vous pouvez ensuite spécialiser ces classes filles en y ajoutant des attributs et/ou méthodes supplémentaires. 

En d’autres termes, une classe mère sera considérée comme “notre référence” et grâce au mécanisme d’héritage, on partagera ses attributs et méthodes à ses classes filles.

Dans l’exemple ci-dessous, nous avons une classe mère  FigureGeo que nous allons spécialiser en  Carre. Le mot clé est extends.

Commençons par définir la classe mère FigureGeo :

public class FigureGeo {
private int x;
private int y;
public void moveTo(int newX, int newY) {
this.x = newX;
this.y = newY;
}
}

Ensuite, nous créons une classe fille Carre :

public class Carre extends FigureGeo {
private long cote;
public long getCote() {
return cote;
}
public long getPerimetre(){
return 4*cote;
}
}

Avec la classe  Carre, nous avons récupéré automatiquement tous les attributs de la classe de base  FigureGeo. Et nous lui avons ajouté un nouvel attribut de classe et 2 nouvelles méthodes participant ainsi à la spécialisation.

Notons également que lorsqu’on fait de l’héritage, tous les champs sont hérités. Ils peuvent être manipulés si leur accessibilité le permet (nous avons abordé ce concept dans le chapitre 5 de la première partie). 

À quoi correspondent les objets de la classe dérivée ?

Tout objet d'une classe dérivée est considéré comme étant avant tout un objet de la classe de base :

  • un  Carre  est avant tout une FigureGeo ;

  • tout objet d'une classe dérivée « cumule » les  champs dérivés dans la classe de base avec ceux définis dans sa propre classe.

public class Test {
public static void main(String[] args) {
FigureGeo figure = new FigureGeo();
figure.moveTo(1, 1);
Carre carre = new Carre();
carre.moveTo(2, 2);
}
}

Redéfinissez une méthode de classe grâce au polymorphisme

Lorsque vous construisez une classe héritant d'une autre classe, vous avez la possibilité de redéfinir certaines méthodes de la classe mère. Il s'agit de remplacer le comportement de la fonction qui a été définie par la classe mère.

C’est le concept de polymorphisme. L’idée étant de pouvoir utiliser le même nom de méthode sur des objets différents. Et bien sûr, cela n’a de sens que si le comportement des méthodes est différent.

Considérons le code ci-dessous, considérons la méthode  déplacer()  dans la classe mère  Animal :

class Animal {
void deplacer() {
System.out.println("Je me déplace");
}

Appliquons le principe de polymorphisme pour cette méthode dans les différentes classes filles  Chien,  Oiseau  et  Pigeon  :

class Chien extends Animal {
void deplacer() {
System.out.println("Je marche");
}
}
class Oiseau extends Animal {
void deplacer(){
System.out.println("Je vole");
}
}
class Pigeon extends Oiseau {
void deplacer() {
System.out.println("Je vole surtout en ville");
}
}

Sur toutes ces classes, vous pouvez donc appeler  deplacer(). Le polymorphisme permet alors d'appeler la méthode adéquate selon le type d'objet :

public class Test {
public static void main(String[] args) {
Animal a1 = new Animal();
Animal a2 = new Chien();
Animal a3 = new Pigeon();
a1.deplacer();
a2.deplacer();
a3.deplacer();
}
}

Et à l'exécution, ça donne :

Je me déplace
Je marche
Je vole surtout en ville

En résumé

Dans ce chapitre, vous appris à faire de l'héritage en Java. C'est un concept fondamental de toute programmation orientée objet. Nous avons également vu qu'il vous est possible de "surcharger" les méthodes d'une classe mère lorsqu'on en hérite : c'est-à-dire, redéfinir leurs comportements sans changer leur signature. C'est le polymorphisme, un autre concept fondamental.

Dans le prochain chapitre, nous aborderons le traitement logique par condition.

Exemple de certificat de réussite
Exemple de certificat de réussite