Maîtriser le mot-clé super en Java : usages avancés et exemples pratiques
Maîtriser le mot-clé super de Java : usages avancés et exemples pratiques
Découvrez comment le mot-clé super débloque de puissantes capacités d'héritage en Java, avec des exemples clairs et des conseils d'experts.
Le mot-clé super est une pierre angulaire du modèle d'héritage de Java, permettant aux sous-classes de référencer les membres – champs, méthodes et constructeurs – de leur superclasse directe. Comprendre ses nuances est essentiel pour écrire un code propre et maintenable.
Usages principaux de super
- Invoquer les méthodes de superclasse redéfinies.
- Accéder aux champs de superclasse masqués par les champs de sous-classe.
- Appeler explicitement un constructeur de superclasse depuis un constructeur de sous-classe.
Plongeons dans chaque scénario avec des exemples de code.
1. Appel d'une méthode de superclasse redéfinie
Quand une sous-classe redéfinit une méthode, la version de la superclasse reste accessible via super.nomMethode(). C'est crucial pour étendre le comportement sans perdre la fonctionnalité originale.
Exemple : Redéfinition de méthode et super
class Animal { public void display() { System.out.println("I am an animal"); } } class Dog extends Animal { @Override public void display() { System.out.println("I am a dog"); } public void printMessage() { display(); // Appelle Dog.display() super.display(); // Appelle Animal.display() } } public class Main { public static void main(String[] args) { Dog dog = new Dog(); dog.printMessage(); } }
Sortie :
I am a dog I am an animal
L'utilisation de super.display() assure l'exécution de l'implémentation de la superclasse, utile pour étendre la fonctionnalité plutôt que la remplacer.
2. Accès aux champs de superclasse masqués
Si superclasse et sous-classe déclarent un champ du même nom, le champ de la sous-classe masque celui de la superclasse. super.nomChamp permet de référencer le champ original.
Exemple : Masquage de champ
class Animal { protected String type = "animal"; } class Dog extends Animal { public String type = "mammal"; public void printType() { System.out.println("I am a " + type); // Dog.type System.out.println("I am an " + super.type); // Animal.type } } public class Main { public static void main(String[] args) { Dog dog = new Dog(); dog.printType(); } }
Sortie :
I am a mammal I am an animal
3. Utiliser super() pour appeler un constructeur de superclasse
Les constructeurs ne sont pas hérités, mais une sous-classe peut invoquer un constructeur de superclasse en utilisant super(). Cela doit être la première instruction dans le constructeur de la sous-classe et est requis quand la superclasse n'a pas de constructeur sans argument ou quand vous devez passer des arguments.
Exemple 1 : Appel du constructeur par défaut
class Animal { Animal() { System.out.println("I am an animal"); } } class Dog extends Animal { Dog() { super(); System.out.println("I am a dog"); } } public class Main { public static void main(String[] args) { new Dog(); } }
Sortie :
I am an animal I am a dog
Exemple 2 : Appel de constructeur paramétré
class Animal { Animal(String type) { System.out.println("Type: " + type); } } class Dog extends Animal { Dog() { super("Animal"); System.out.println("I am a dog"); } } public class Main { public static void main(String[] args) { new Dog(); } }
Sortie :
Type: Animal I am a dog
Dans le cas paramétré, le compilateur ne peut pas invoquer automatiquement un constructeur non-défaut, donc super(arguments) est obligatoire.
Maîtriser le mot-clé super vous permet d'écrire des hiérarchies d'héritage robustes, assurant que la logique redéfinie reste accessible et que les constructeurs sont correctement initialisés. Ces techniques sont essentielles pour les applications Java évolutives et s'alignent avec les meilleures pratiques recommandées par les experts de l'industrie.
Java
- Maîtriser les opérateurs Java : Types, syntaxe et exemples pratiques
- Commentaires Java : Types, utilisation et bonnes pratiques
- Maîtriser la boucle for améliorée en Java : Syntaxe, exemples et bonnes pratiques
- Maîtriser les chaînes de caractères en Java : Création, méthodes et bonnes pratiques
- Maîtriser les interfaces Java : concepts, implémentation et bonnes pratiques
- Maîtriser les classes internes anonymes en Java : définition, syntaxe et exemples pratiques
- Maîtriser le try-with-resources Java : gestion automatique des ressources expliquée
- Annotations Java expliquées : types, placement et exemples pratiques
- Assertions Java : guide pratique pour détecter les bugs et assurer la fiabilité du code