ProgrammationDéveloppeur Java

Comment fonctionne le mécanisme de surcharge de méthodes (method overriding) en Java, comment l'utiliser correctement et quels points doivent être pris en compte ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

La surcharge de méthodes (overriding) est un mécanisme de la POO où une sous-classe fournit sa propre implémentation d'une méthode déjà définie dans sa superclasse. La méthode dans la sous-classe doit avoir le même nom, les mêmes paramètres et le même type de retour (ou être son sous-type).

Règles clés :

  • Les méthodes doivent être publiques ou protégées (niveau d'accès pas plus strict).
  • Vous ne pouvez pas surcharger les méthodes privées et statiques.
  • L'utilisation de l'annotation @Override aide à détecter les erreurs au moment de la compilation.
  • En Java, les types de retour covariants sont supportés (une méthode surchargée peut retourner un sous-type du type de retour d'origine).
  • Exceptions : une méthode dans la sous-classe ne peut pas déclarer de nouvelles exceptions vérifiées qui ne figurent pas dans la signature de la méthode de base.

Exemple :

class Animal { public void sound() { System.out.println("Some sound"); } } class Dog extends Animal { @Override public void sound() { System.out.println("Woof"); } }

Question piégeuse.

Question : "Peut-on surcharger une méthode statique en Java ?"

Réponse : Non, les méthodes statiques ne peuvent pas être surchargées. Elles sont cachées (method hiding). Si vous déclarez une méthode statique avec la même signature dans une sous-classe, il s'agira d'une cachette, et non d'une surcharge.

Exemple :

class A { static void print() { System.out.println("A"); } } class B extends A { static void print() { System.out.println("B"); } } A obj = new B(); obj.print(); // affichera "A"

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet.


Histoire

Dans un projet, l'un des développeurs a essayé de "surcharger" une méthode static dans la classe héritée, s'attendant à ce que la version de la sous-classe soit appelée par référence de la superclasse. Cela a conduit à des résultats inattendus : la méthode de la superclasse était appelée, ce qui a rendu le programme incorrect.


Histoire

Il est important d'utiliser l'annotation @Override. Dans un projet, un développeur a fait une erreur dans le nom de la méthode lors de la surcharge, et sans l'annotation, le compilateur n'a pas signalé d'erreur. En conséquence, la méthode de la classe de base a été appelée (par défaut) sur la hiérarchie d'héritage, ce qui a entraîné une logique incorrecte dans les processus métier.


Histoire

Masquage des exceptions vérifiées : un développeur a ajouté au modèle de méthode surchargé le lancement d'une nouvelle exception vérifiée, qui n'était pas spécifiée dans la signature d'origine. Le code a été compilé avec une erreur et il a fallu changer l'architecture car cela enfreint la règle de surcharge des exceptions.