Relations Parent-Enfant
Héritage
Java permet à une classe d'acquérir les propriétés d'une autre classe via le mécanisme d'héritage. La classe héritant des propriétés est appelée classe enfant, tandis que la classe héritée est la classe parente.
Mot-clé extends
Le mot-clé extends établit la relation d'héritage :
class Parent {
// Membres et méthodes
}
class Enfant extends Parent {
// Implémentation spécifique
}
La classe enfant hérite de tous les membres du parent, y compris les champs private (accessibles uniquement via les méthodes du parent).
Visibilité protected
Le modificateur protected permet aux classes enfants d'accéder directement aux membres, contrairement à private. L'accès par défaut (sans modificateur) autorise l'accès aux classes du même package.
Redéfinition de méthodes
Pour mdoifier le comportement d'une méthode héritée :
class Gestionnaire extends Employe {
public double calculerSalaire() {
double salaireBase = super.calculerSalaire();
return salaireBase + prime;
}
}
super invoque la méthode parente, tandis que this référence l'instance courante.
Constructeurs
Les constructeurs ne sont pas hérités. Java appelle automatiquement le constructeur parent dans le constructeur enfant :
class Gestionnaire extends Employe {
Gestionnaire() {
super(); // Appel implicite au constructeur parent
// Initialisations supplémentaires
}
}
Règles d'héritage
- Une classe parente peut avoir plusieurs enfants
- Une classe enfant ne peut hériter que d'une seule classe parente
- Java ne supporte pas l'héritage multiple
Polymorphisme
Une variable parente peut référencer une instance enfant :
Employe e = new Gestionnaire(); // Valide
Gestionnaire g = new Employe(); // Invalide
Liaison dynamique
Java détermine à l'exécution quelle version de méthode invoquer :
| Méthode | Employe | Gestionnaire |
|---|---|---|
| getNom() | Parent | Parent |
| calculerSalaire() | Parent | Enfent |
Restrictions final
Une classe final ne peut être héritée. Une méthode final ne peut être redéfinie.
Classes abstraites
Déclarées avec abstract, elles contiennent des méthodes sans implémentation :
abstract class Personne {
public abstract String getDescription();
}
Les classes enfants doivent implémenter les méthodes abstraites. Impossible d'instanceir une classe abstraite.
Classe Object
Toutes les classes héritent implicitement d'Object.
Redéfinition de equals
public boolean equals(Object autre) {
if (this == autre) return true;
if (autre == null) return false;
if (getClass() != autre.getClass()) return false;
// Comparaison des champs
}
Redéfinition de toString
public String toString() {
return "Représentation textuelle";
}
Listes génériques
ArrayList permet des collections redimensionnables :
ArrayList<Employe> equipe = new ArrayList<>();
equipe.add(new Employe());
equipe.remove(0);