Redéfinition de méthode (@Override)
Fait partie de la section Programmation Orientée Objet du Journey Java de Coddy. Leçon 22 sur 87.
La redéfinition de méthode permet à une sous-classe de fournir sa propre implémentation d’une méthode déjà définie dans sa classe parente. C’est ainsi que les classes enfants personnalisent le comportement hérité pour l’adapter à leurs besoins spécifiques.
Lorsque vous redéfinissez une méthode, la version de la sous-classe remplace complètement celle de la classe parente pour les objets de cette sous-classe. La méthode doit avoir le même nom et les mêmes paramètres que la méthode parente, ainsi qu’un type de retour identique à celui de la méthode parente (ou un sous-type de celui-ci) :
public class Animal {
public void makeSound() {
System.out.println("Some generic sound");
}
}
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof!");
}
}
public class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Meow!");
}
}L’annotation @Override indique au compilateur que vous avez l’intention de redéfinir une méthode parente. Bien qu’elle soit facultative, elle est fortement recommandée, car le compilateur détectera les erreurs si vous faites accidentellement une faute d’orthographe dans le nom de la méthode ou utilisez des paramètres incorrects :
@Override
public void makeSound() { } // Correct - le compilateur vérifie ceci
public void makesound() { } // Faute de frappe ! Crée une nouvelle méthode au lieu de redéfinirLorsque vous appelez une méthode redéfinie, Java exécute la version qui appartient au type réel de l’objet :
Dog dog = new Dog();
dog.makeSound(); // Sortie : Woof!
Cat cat = new Cat();
cat.makeSound(); // Sortie : Meow!Souviens-toi de la leçon précédente : tu peux utiliser super.methodName() à l’intérieur d’une méthode redéfinie si tu veux toujours inclure le comportement du parent en plus de ton nouveau code.
Défi
FacileConstruisons un système de notifications qui montre comment les sous-classes peuvent redéfinir les méthodes de leur classe parente pour fournir leur propre comportement spécialisé. Tu verras comment l’annotation @Override aide à détecter les erreurs et comment chaque sous-classe peut personnaliser les méthodes héritées.
Tu vas créer trois fichiers pour organiser ton code :
Notification.java: crée la classe parente qui représente une notification générique. Elle doit contenir :- un champ privé pour le
message(String) - un constructeur qui accepte le message
- une méthode
getMessage()qui renvoie le message - une méthode
send()qui affiche :Sending notification: [message]
- un champ privé pour le
EmailNotification.java: crée une sous-classe qui étend Notification et personnalise la manière dont les notifications sont envoyées par e-mail :- un champ privé pour l’adresse e-mail du
recipient(String) - un constructeur qui accepte à la fois le message et le destinataire, en utilisant
super(message)pour la partie parente - redéfinis la méthode
send()à l’aide de l’annotation@Overridepour afficher :Emailing [recipient]: [message]
- un champ privé pour l’adresse e-mail du
Main.java: montre comment le même nom de méthode produit un comportement différent selon le type de l’objet. Tu recevras deux entrées : un message et une adresse e-mail. Crée à la fois une Notification ordinaire et une EmailNotification avec le même message, puis appellesend()sur chacune pour observer les différents résultats.
Tu recevras deux entrées : le message (String) et l’adresse e-mail du destinataire (String).
Ta sortie doit afficher deux lignes : la première provenant de la méthode send() de la classe parente, puis la seconde provenant de la version redéfinie dans EmailNotification. Cela montre comment la redéfinition de méthode permet aux sous-classes de remplacer le comportement hérité par leur propre implémentation.
Essayez vous-même
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Lire les entrées
String message = scanner.nextLine();
String recipient = scanner.nextLine();
// TODO: Create a Notification object with the message
// TODO: Create an EmailNotification object with the message and recipient
// TODO: Call send() on the Notification object
// TODO: Call send() on the EmailNotification object
}
}
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érateurEntraînez-vous par vous-même : Compilateur Java en ligne