13.2 Héritage et polymorphisme en Java : mot-clé 'extends'
L'héritage est l'un des piliers fondamentaux de la programmation orientée objet (POO). En Java, l'héritage permet à une classe d'hériter des champs et méthodes d'une autre classe, favorisant la réutilisation du code et la création d'une relation hiérarchique entre les classes. Le mot clé extends
est utilisé pour établir cette relation d'héritage entre deux classes.
Concept d'héritage
En héritage, nous avons deux entités principales : la classe parent (ou superclasse) et la classe enfant (ou sous-classe). La classe enfant hérite des attributs et comportements de la classe parent, mais peut également définir ses propres membres et comportements. Cela signifie que la classe enfant est une spécialisation de la classe parent, où elle possède non seulement les traits de la classe parent, mais ajoute également ses propres caractéristiques uniques.
Utilisation du mot-clé 'extends'
Pour implémenter l'héritage en Java, nous utilisons le mot-clé extends
dans la déclaration de la classe enfant. Prenons un exemple simple :
classe Animal {
vide manger() {
System.out.println("Cet animal mange");
}
}
la classe Chien étend Animal {
écorce vide() {
System.out.println("Le chien aboie");
}
}
Dans l'exemple ci-dessus, Dog
est une sous-classe de Animal
. Cela signifie que Dog
hérite de la méthode eat()
de Animal
et définit également sa propre méthode bark()
. Un objet de classe Dog
peut appeler les deux méthodes.
Polymorphisme et héritage
Le polymorphisme est un autre concept clé de la POO qui est étroitement lié à l'héritage. Cela signifie « plusieurs formes » et permet aux objets d'être traités comme des instances de leurs classes parentes plutôt que comme leurs classes réelles. En Java, cela est possible grâce à l'héritage et au fait qu'une variable de référence de superclasse peut pointer vers un objet de sous-classe. Cela permet aux méthodes d'être appelées de manière polymorphe.
Par exemple :
Animal monAnimal = new Dog();
monAnimal.eat(); // Appel de la méthode de la classe Animal
// monAnimal.bark(); // Erreur de compilation : Le type animal n'a pas la méthode aboiement
Ici, la variable myAnimal
est de type Animal
, mais pointe vers une instance de Dog
. Cela permet à la méthode eat()
d'être appelée de manière polymorphe. Cependant, si nous essayons d'appeler bark()
via myAnimal
, nous recevrons une erreur de compilation, car le compilateur ne connaît que les méthodes définies dans le fichier Animal
. classe de code >.
Remplacement de méthode
Une fonctionnalité importante de l'héritage en Java est la possibilité de remplacer les méthodes. Cela signifie qu'une sous-classe peut fournir sa propre implémentation d'une méthode déjà définie dans sa superclasse. Pour remplacer une méthode, la sous-classe doit définir une méthode avec la même signature que la méthode de la superclasse.
la classe Chat étend Animal {
@Passer outre
vide manger() {
System.out.println("Le chat mange du poisson");
}
}
Dans l'exemple ci-dessus, la classe Cat
remplace la méthode eat()
de la classe Animal
. L'annotation @Override
est facultative, mais il est recommandé de l'utiliser car elle indique au compilateur et aux développeurs que la méthode est un remplacement intentionnel.
Polymorphisme et remplacement de méthode
Lorsqu'une méthode est remplacée, le polymorphisme garantit que la version remplacée de la méthode est appelée lorsque l'objet est traité comme une instance de la superclasse. C'est un élément fondamental de ce qui rend le polymorphisme si puissant en Java.
Animal monChat = nouveau Chat();
monChat.eat(); // Appel de la méthode surchargée de la classe Cat
Dans ce cas, même si myCat
est de type Animal
, la méthode eat()
qui est appelée est celle de la classe < code> Gato, car l'objet réel est une instance de Gato
.
Considérations finales
L'héritage et le polymorphisme sont des concepts fondamentaux qui permettent aux classes Java d'être réutilisables, extensibles et gérables. Le mot-clé extends
est la passerelle vers l'héritage, tandis que le polymorphisme permet de traiter uniformément des objets de différentes classes. Comprendre ces concepts est essentiel pour tout programmeur souhaitant maîtriser Java et développer des systèmes robustes et flexibles.
De plus, il est important d'être conscient des limites et des considérations lors de l'utilisation de l'héritage, comme le problème du « diamant » dans l'héritage multiple (que Java résout en n'autorisant pas l'héritage multiple de classes) et l'importance de l'encapsulation à maintenir. une hiérarchie de classes bien définies et sûres.
En bref, le lierreLa force et le polymorphisme sont des outils puissants qui, lorsqu'ils sont utilisés correctement, peuvent améliorer considérablement la conception et la maintenance des logiciels. Le mot-clé extends
n'est que le début d'un vaste monde de possibilités qu'offre la programmation orientée objet.