Les deux réutilisent un nom de méthode, mais ils sont fondamentalement différents. La surcharge = même nom, paramètres différents, dans la même classe, résolu au . = une sous-classe une méthode parente avec la , résolu au .
Les deux réutilisent un nom de méthode, mais ils sont fondamentalement différents. La surcharge = même nom, paramètres différents, dans la même classe, résolu au . = une sous-classe une méthode parente avec la , résolu au .
| Surcharge | Dépassement | |
|---|---|---|
| Signature | Doit différer (params) | Doit être identique |
| Relation | Même classe | Parent ↔ sous-classe |
| Résolu | Temps de compilation (statique) | Temps d'exécution (dynamique) |
| Objectif | Commodité / variantes | Polymorphisme |
class Printer {
void print(String s) { System.out.println(s); }
void print(int n) { System.out.println(n); } // same name, diff param
void print(String s, int times) { /* ... */ }
}
Le compilateur choisit quelle print utiliser selon les types d'argument — aucune héritage impliqué.
class Animal { String speak() { return "..."; } }
class Dog extends Animal {
@Override
String speak() { return "Woof"; } // replaces Animal.speak()
}
Animal a = new Dog();
a.speak(); // "Woof" — runtime picks Dog's version (dynamic dispatch)
Une erreur fréquente est de surcharger accidentellement quand vous vouliez faire un dépassement (par exemple une faute de frappe dans la signature). Utilisez toujours @Override (Java) ou override (C#) pour que le compilateur le détecte.
Le dépassement est le moteur du polymorphisme — le mécanisme d'exécution qui fait fonctionner « une interface, plusieurs implémentations ».
Connaître la différence prévient un bug classique : penser que vous avez remplacé le comportement alors que vous avez en fait créé une deuxième méthode jamais appelée.
Une bibliothèque de questions d'entretien IT avec des réponses détaillées — du Junior au Senior.
Faire un don