Héritage de base (extends)
Fait partie de la section Programmation Orientée Objet du Journey Java de Coddy — leçon 20 sur 87.
L'héritage est l'un des piliers fondamentaux de la POO. Il permet à une classe d'acquérir les propriétés et les méthodes d'une autre classe, favorisant la réutilisation du code et établissant une hiérarchie naturelle entre les classes.
En Java, vous créez une relation d'héritage en utilisant le mot-clé extends. La classe qui hérite est appelée la sous-classe (ou classe enfant), et la classe dont on hérite est la super-classe (ou classe parent).
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public void eat() {
System.out.println(name + " is eating");
}
public String getName() {
return name;
}
}
public class Dog extends Animal {
public Dog(String name) {
super(name); // Appelle le constructeur parent
}
public void bark() {
System.out.println(getName() + " says woof!");
}
}La classe Dog hérite automatiquement de la méthode eat() et de la méthode getName() de Animal. Elle peut également définir ses propres méthodes comme bark() :
Dog myDog = new Dog("Buddy");
myDog.eat(); // Hérité : "Buddy is eating"
myDog.bark(); // Méthode propre : "Buddy says woof!"Considérez l'héritage comme une relation de type « est un ». Un Dog est un Animal, il est donc logique que Dog étende Animal. Cette relation vous permet de construire des classes spécialisées qui partagent des fonctionnalités communes tout en ajoutant leurs propres comportements uniques.
Défi
FacileConstruisons un système de véhicule simple qui démontre l'héritage en action. Vous allez créer une classe parente qui contient les propriétés communes des véhicules, et une classe enfant qui l'étend avec un comportement spécialisé.
Vous organiserez votre code sur trois fichiers :
Vehicle.java: Créez la classe parente qui représente n'importe quel véhicule. Elle doit avoir :- Un champ privé pour la marque du véhicule
brand(String) - Un constructeur qui accepte le nom de la marque (l'utilisation de
super()n'est pas nécessaire ici puisque Vehicle est le parent) - Une méthode
getBrand()qui retourne la marque - Une méthode
start()qui affiche :[brand] is starting
- Un champ privé pour la marque du véhicule
Motorcycle.java: Créez une sous-classe qui étend Vehicle. Une moto est un véhicule, donc cette relation "est-un" rend l'héritage approprié. Votre Motorcycle doit :- Utiliser
extendspour hériter de Vehicle - Avoir un constructeur qui prend la marque et la transmet au parent en utilisant
super(brand) - Ajouter sa propre méthode
wheelie()qui affiche :[brand] is doing a wheelie!
- Utiliser
Main.java: Rassemblez le tout en créant un objet Motorcycle et en démontrant à la fois les comportements hérités et uniques. Vous recevrez une entrée : le nom de la marque. Affichez deux lignes en appelant :- La méthode héritée
start() - La propre méthode
wheelie()de Motorcycle
- La méthode héritée
Vous recevrez une entrée : le nom de la marque (String) pour votre moto.
Remarquez comment votre Motorcycle a automatiquement accès à start() et getBrand() sans avoir à les réécrire - c'est tout le pouvoir de l'héritage !
Aide-mémoire
Utilisez le mot-clé extends pour créer une relation d'héritage entre les classes :
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public void eat() {
System.out.println(name + " is eating");
}
public String getName() {
return name;
}
}
public class Dog extends Animal {
public Dog(String name) {
super(name); // Appelle le constructeur parent
}
public void bark() {
System.out.println(getName() + " says woof!");
}
}La sous-classe (enfant) hérite de toutes les méthodes de la superclasse (parent) et peut ajouter les siennes :
Dog myDog = new Dog("Buddy");
myDog.eat(); // Méthode héritée
myDog.bark(); // Sa propre méthodeUtilisez super() dans le constructeur de la sous-classe pour appeler le constructeur de la classe parente.
L'héritage représente une relation « est un » (is-a) entre les classes.
Essayez vous-même
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String brand = scanner.nextLine();
// TODO: Créer un objet Motorcycle avec la marque brand
// TODO: Appeler la méthode héritée start()
// TODO: Appeler la méthode wheelie()
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe mot-clé thisMéthodesChamps (Attributs)Méthode constructeurSurcharge de constructeurRécapitulatif - Calculatrice simple4Héritage
Héritage de base (extends)Le mot-clé superRedéfinition de méthode (@Override)Chaînage de constructeursLa classe ObjectHéritage simple et multiniveauPourquoi pas d'héritage multiple de classesRécapitulatif - Hiérarchie des employés7Méthodes spéciales et classe Object
Méthode toString()equals() et hashCode()Méthode clone()compareTo() et ComparableInterface ComparatorRécapitulatif - Tri personnalisé2Modificateurs d'accès et Encapsulation
Aperçu des niveaux d'accèsMéthodes Getter et SetterMasquage d'informationsLe mot-clé finalRécapitulatif - Gestionnaire de compte bancaire5Polymorphisme
Bases de la surcharge de méthodesRedéfinition de méthodes (Run-Time)Upcasting et DowncastingL'opérateur instanceofClasses et méthodes abstraitesRécapitulatif - Calculateur de formes8Concepts avancés de la POO
Composition vs HéritageAgrégation vs CompositionClasses internes, imbriquées et anonymesEnums et méthodes d'EnumRecords (Java 16+)Classes scellées (Java 17+)11Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron MonteurPatron ObservateurPatron Stratégie3Propriétés de classe et membres statiques
Variables d'instance vs variables statiquesMéthodes statiquesBlocs statiquesConstantes (static final)Récapitulatif - Compteur et utilitaire6Interfaces et Classes Abstraites
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesDefault et Static dans les InterfacesClasses Abstraites vs InterfacesInterfaces FonctionnellesRécapitulatif - Système de Paiement9La généricité
Introduction à la généricitéClasses génériquesMéthodes génériquesParamètres de type bornésWildcards (?, extends, super)Récapitulatif - Conteneur générique12Patrons de conception, partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Template MethodPatron ÉtatPatron CompositePatron Itérateur