6.1Héritage
6.1.1 – Classe mère et classe fille
L'héritage est un mécanisme fondamental de la programmation orientée objet qui permet à une classe (appelée classe fille ou sous-classe) d'hériter des attributs et méthodes d'une autre classe (appelée classe mère ou super-classe). Cela favorise la réutilisation de code et établit une relation "est-un" entre les classes.
🔑 Syntaxe de l'héritage
Pour qu'une classe hérite d'une autre, on utilise le mot-clé extends suivi du nom de la classe mère.
Exemple : Héritage de base
// Classe mère (super-classe)
public class Personne {
protected String nom;
protected int age;
public void sePresenter() {
System.out.println("Je suis " + nom + ", j'ai " + age + " ans.");
}
public void vieillir() {
age++;
}
}
// Classe fille (sous-classe) - hérite de Personne
public class Etudiant extends Personne {
private String numeroEtudiant;
// Hérite automatiquement de :
// - nom (attribut protected)
// - age (attribut protected)
// - sePresenter() (méthode publique)
// - vieillir() (méthode publique)
public void afficherNumero() {
System.out.println("Numéro étudiant : " + numeroEtudiant);
}
}
📋 Ce qui est hérité
Une classe fille hérite de :
- Attributs : Tous les attributs
publicetprotectedde la classe mère - Méthodes : Toutes les méthodes
publicetprotectedde la classe mère - Constructeurs : Les constructeurs ne sont pas hérités, mais peuvent être appelés avec
super()
- Les attributs et méthodes
privatene sont pas accessibles directement dans la classe fille - Les attributs et méthodes
package-private(sans modificateur) sont accessibles si la classe fille est dans le même package - Java ne supporte que l'héritage simple : une classe ne peut hériter que d'une seule classe mère
đź’ˇ Exemple complet d'utilisation
Exemple : Utilisation de l'héritage
public class Main {
public static void main(String[] args) {
// Créer un étudiant
Etudiant etudiant = new Etudiant();
// Utiliser les attributs hérités (protected, donc accessibles)
etudiant.nom = "Alice";
etudiant.age = 20;
// Utiliser les méthodes héritées
etudiant.sePresenter(); // Méthode héritée de Personne
etudiant.vieillir(); // Méthode héritée de Personne
// Utiliser les méthodes propres à Etudiant
etudiant.numeroEtudiant = "E12345";
etudiant.afficherNumero();
}
}
🔄 Hiérarchie d'héritage
L'héritage peut créer une hiérarchie de classes où une classe peut être à la fois classe mère et classe fille.
Exemple : Hiérarchie d'héritage
// Classe mère
public class Animal {
protected String nom;
public void manger() {
System.out.println(nom + " mange.");
}
}
// Classe fille de Animal, classe mère de Chien
public class Mammifere extends Animal {
protected int nombrePattes;
public void allaiter() {
System.out.println("Allaite ses petits.");
}
}
// Classe fille de Mammifere
public class Chien extends Mammifere {
public void aboyer() {
System.out.println("Wouf wouf !");
}
}
// Chien hérite de :
// - nom (de Animal)
// - manger() (de Animal)
// - nombrePattes (de Mammifere)
// - allaiter() (de Mammifere)
// - aboyer() (propre Ă Chien)
6.1.2 – Le mot-clé super
Le mot-clé super permet d'accéder aux membres (attributs, méthodes, constructeurs) de la classe mère. Il est l'équivalent de this mais pour la classe parente.
🔑 Utilisation de super
super peut être utilisé de trois manières :
- super() : Appeler le constructeur de la classe mère
- super.membre : Accéder à un attribut de la classe mère
- super.methode() : Appeler une méthode de la classe mère
🏗️ Appel du constructeur de la classe mère (super())
Dans un constructeur de classe fille, vous pouvez appeler le constructeur de la classe mère avec super(). Cet appel doit être la première instruction du constructeur.
Exemple : Appel du constructeur parent
public class Personne {
protected String nom;
protected int age;
public Personne(String nom, int age) {
this.nom = nom;
this.age = age;
System.out.println("Constructeur Personne appelé");
}
}
public class Etudiant extends Personne {
private String numeroEtudiant;
public Etudiant(String nom, int age, String numeroEtudiant) {
super(nom, age); // Appelle le constructeur de Personne
this.numeroEtudiant = numeroEtudiant;
System.out.println("Constructeur Etudiant appelé");
}
}
// Utilisation
Etudiant e = new Etudiant("Alice", 20, "E12345");
// Affiche :
// Constructeur Personne appelé
// Constructeur Etudiant appelé
super()doit être la première instruction dans le constructeur- Si vous n'appelez pas explicitement
super(), Java appelle automatiquement le constructeur par défaut de la classe mère - Si la classe mère n'a pas de constructeur par défaut et que vous n'appelez pas
super(...), vous aurez une erreur de compilation
📞 Appel d'une méthode de la classe mère (super.methode())
Vous pouvez appeler une méthode de la classe mère même si elle est redéfinie dans la classe fille.
Exemple : Appel de méthode parente
public class Personne {
public void sePresenter() {
System.out.println("Je suis une personne.");
}
public void afficherInfo() {
System.out.println("Informations de base");
}
}
public class Etudiant extends Personne {
@Override
public void sePresenter() {
System.out.println("Je suis un étudiant.");
}
public void afficherTout() {
super.sePresenter(); // Appelle la méthode de Personne
this.sePresenter(); // Appelle la méthode redéfinie dans Etudiant
super.afficherInfo(); // Appelle la méthode de Personne
}
}
// Utilisation
Etudiant e = new Etudiant();
e.afficherTout();
// Affiche :
// Je suis une personne.
// Je suis un étudiant.
// Informations de base
🔍 Accès aux attributs de la classe mère (super.attribut)
Vous pouvez accéder aux attributs de la classe mère avec super, surtout quand il y a un conflit de noms.
Exemple : Accès aux attributs parent
public class Personne {
protected String nom = "Personne";
}
public class Etudiant extends Personne {
private String nom = "Etudiant"; // Masque l'attribut de Personne
public void afficherNoms() {
System.out.println("Nom (Etudiant) : " + this.nom); // Affiche : Etudiant
System.out.println("Nom (Personne) : " + super.nom); // Affiche : Personne
}
}
📊 Tableau de comparaison : this vs super
| Caractéristique | this | super |
|---|---|---|
| Référence | Objet courant (classe actuelle) | Classe mère (super-classe) |
| Constructeur | this() - appelle un autre constructeur de la même classe | super() - appelle le constructeur de la classe mère |
| Méthode | this.methode() - méthode de la classe actuelle | super.methode() - méthode de la classe mère |
| Attribut | this.attribut - attribut de la classe actuelle | super.attribut - attribut de la classe mère |
💡 Points clés à retenir
- super() : Appelle le constructeur de la classe mère (première instruction)
- super.methode() : Appelle une méthode de la classe mère
- super.attribut : Accède à un attribut de la classe mère
- Constructeur par défaut : Si vous n'appelez pas
super(), Java appelle automatiquement le constructeur par défaut de la classe mère - Résolution de conflits :
superest utile pour résoudre les conflits de noms entre classe mère et classe fille
- Utilisez
super()pour initialiser correctement les attributs de la classe mère - Utilisez
super.methode()pour étendre le comportement d'une méthode plutôt que de le remplacer complètement - N'oubliez pas que
super()doit être la première instruction du constructeur - Si la classe mère n'a pas de constructeur par défaut, vous devez obligatoirement appeler
super(...)avec les bons paramètres