Historique de la question :
Dans les premières versions de Java, un mécanisme d'héritage a été intégré, permettant à une sous-classe d'étendre le comportement de la classe parente. Pour accéder aux membres de la classe parente, on utilise le mot-clé super, hérité de C++.
Problème :
Il arrive parfois qu'il soit nécessaire de faire explicitement référence à une méthode ou à un champ de la classe parente, s'ils ont été redéfinis ou cachés. Sans une utilisation correcte de super, des erreurs ou des comportements incorrects peuvent se produire, par exemple lors de la gestion des constructeurs.
Solution :
Avec super, vous pouvez :
Exemple :
class Animal { void makeSound() { System.out.println("Son d'animal"); } } class Dog extends Animal { void makeSound() { super.makeSound(); // Son d'animal System.out.println("Aboyer"); } }
Caractéristiques clés :
L'appel à super peut-il ne pas être la première ligne du constructeur ?
Non. L'appel au constructeur parent via super() doit impérativement être la première ligne du constructeur. Si cette contrainte est violée, le compilateur renverra une erreur.
Peut-on utiliser super dans des méthodes ou contextes statiques ?
Non. Le mot-clé super ne peut être utilisé que dans un contexte non statique (d'instance), car il se rapporte à la hiérarchie des objets, et non à celle des classes.
Peut-on accéder à une méthode privée du parent via super ?
Non. Les méthodes privées ne sont pas visibles pour les descendants — même via super. Seules les méthodes ou champs publics, protégés ou package-private peuvent être accessibles via super.
Un développeur oublie d'appeler explicitement super() dans le constructeur de la classe dérivée, et la superclasse n'a pas de constructeur par défaut.
Avantages :
Inconvénients :
La méthode redéfinie dans la sous-classe appelle d'abord l'implémentation super, puis l'étend avec une logique supplémentaire.
Avantages :
Inconvénients :