↑
CHAPITRE 6.1

Héritage

Créer des classes qui héritent d'autres classes
L'héritage permet à une classe (classe fille) d'hériter des attributs et méthodes d'une autre classe (classe mère). C'est un mécanisme fondamental de la POO qui permet la réutilisation de code.

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 public et protected de la classe mère
  • MĂ©thodes : Toutes les mĂ©thodes public et protected de la classe mère
  • Constructeurs : Les constructeurs ne sont pas hĂ©ritĂ©s, mais peuvent ĂŞtre appelĂ©s avec super()
Important :
  • Les attributs et mĂ©thodes private ne 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é
Règles importantes :
  • 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 : super est utile pour rĂ©soudre les conflits de noms entre classe mère et classe fille
Conseils pratiques :
  • 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