Redéfinition de méthodes Java : Personnaliser le comportement de la superclasse
Si une classe hérite d'une méthode de sa superclasse, elle peut la redéfinir (override) à condition qu'elle ne soit pas marquée final.
Avantage : définir un comportement spécifique au type de la sous-classe.
Exemple de base
class Animal {
public void bouger() {
System.out.println("Les animaux peuvent bouger");
}
}
class Chien extends Animal {
public void bouger() {
System.out.println("Les chiens peuvent marcher et courir");
}
}
public class TestChien {
public static void main(String args[]) {
Animal a = new Animal(); // référence Animal, objet Animal
Animal b = new Chien(); // référence Animal, objet Chien
a.bouger(); // méthode Animal
b.bouger(); // méthode Chien (liaison dynamique)
}
}
Résultat :
Les animaux peuvent bouger
Les chiens peuvent marcher et courir
Même si b est de type Animal, c'est la méthode de Chien qui s'exécute. À la compilation, on vérifie le type de référence. À l'exécution, la JVM détermine le type réel de l'objet et appelle sa méthode.
Exemple d'erreur de compilation
class Animal {
public void bouger() {
System.out.println("Les animaux peuvent bouger");
}
}
class Chien extends Animal {
public void bouger() {
System.out.println("Les chiens peuvent marcher et courir");
}
public void aboyer() {
System.out.println("Les chiens peuvent aboyer");
}
}
public class TestChien {
public static void main(String args[]) {
Animal a = new Animal();
Animal b = new Chien();
a.bouger();
b.bouger();
b.aboyer(); // ERREUR : Animal n'a pas de méthode aboyer()
}
}
Erreur : cannot find symbol: method aboyer()
Le type de référence (Animal) détermine les méthodes accessibles à la compilation.
Règles de redéfinition
- La liste d'arguments doit être identique à celle de la méthode redéfinie
- Le type de retour doit être le même ou un sous-type (covariant return type)
- Le niveau d'accès ne peut pas être plus restrictif (ex:
public→protectedinterdit) - Seules les méthodes d'instance héritées peuvent être redéfinies
- Une méthode
finalne peut pas être redéfinie - Une méthode
staticne peut pas être redéfinie (mais peut être redéclarée = hiding) - Si une méthode ne peut pas être héritée, elle ne peut pas être redéfinie
- Sous-classe même package : peut redéfinir toute méthode non
privatenifinal - Sous-classe paquet différent : seulement méthodes
publicouprotectednonfinal - Exceptions : la méthode redéfinie peut lancer n'importe quelle exception non-vérifiée. Pour les exceptions vérifiées : pas de nouvelles exceptions plus larges que celles déclarées. Peut lancer moins d'exceptions ou des sous-types.
- Les constructeurs ne peuvent pas être redéfinis
Utilisation du mot-clé super
Pour invoquer la version de la superclasse d'une méthode redéfinie :
class Animal {
public void bouger() {
System.out.println("Les animaux peuvent bouger");
}
}
class Chien extends Animal {
public void bouger() {
super.bouger(); // appelle la méthode de Animal
System.out.println("Les chiens peuvent marcher et courir");
}
}
public class TestChien {
public static void main(String args[]) {
Animal b = new Chien();
b.bouger();
}
}
Résultat :
Les animaux peuvent bouger
Les chiens peuvent marcher et courir
Java
- Maîtriser les opérateurs Java : Types, syntaxe et exemples pratiques
- Maîtriser les interfaces Java : concepts, implémentation et bonnes pratiques
- Méthode Java String length() : Comment obtenir la taille d'une chaîne (Exemple)
- Maîtriser Java String.indexOf() : Localiser des sous-chaînes et exemples pratiques
- Comprendre Java String.charAt() : Syntaxe, type de retour, exceptions et exemple pratique
- Maîtriser la méthode Java String compareTo() : Syntaxe, cas d'usage et exemples pratiques
- Méthode Java String.contains() : Comment vérifier la présence de sous-chaînes – Exemples pratiques
- Maîtriser Java String.endsWith() : Comment vérifier les suffixes de chaînes avec exemples
- Maîtriser le remplacement de chaînes Java : replace(), replaceAll() et replaceFirst() expliqués