Qu'est-ce que l'héritage et le polymorphisme dans les types de données référencés?
sobes.tech IA
Réponse de l'IA
L'héritage est un mécanisme permettant à une nouvelle classe (classe fille, sous-classe) d'hériter des champs et des méthodes d'une classe existante (classe parente, super-classe). Cela favorise la réutilisation du code et la hiérarchie des classes.
Le polymorphisme (diversité de formes) est la capacité d'un objet à avoir plusieurs formes. Dans le contexte des types de données de référence, cela signifie qu'une variable de super-classe peut faire référence à un objet de sous-classe. Cela permet de traiter des objets de différentes sous-classes de manière unifiée via une interface ou une super-classe commune.
Il existe deux principaux types de polymorphisme :
- Temps de compilation (polymorphisme statique) : généralement réalisé par la surcharge de méthodes (method overloading), lorsqu'une classe possède plusieurs méthodes avec le même nom mais des signatures différentes (nombre et/ou types de paramètres).
- Temps d'exécution (polymorphisme dynamique) : réalisé par la redéfinition de méthodes (method overriding), lorsqu'une sous-classe fournit sa propre implémentation d'une méthode déjà définie dans la super-classe. Lorsqu'on appelle cette méthode via une référence à la super-classe, c'est l'implémentation de la sous-classe qui sera exécutée (si le type de l'objet est une sous-classe).
Exemple d'héritage et de polymorphisme dynamique :
// Classe de base
class Animal {
public void makeSound() {
System.out.println("Son de animal générique");
}
}
// Classe fille
class Dog extends Animal {
@Override // Redéfinition de méthode
public void makeSound() {
System.out.println("Wouf!");
}
}
// Classe fille
class Cat extends Animal {
@Override // Redéfinition de méthode
public void makeSound() {
System.out.println("Miaou!");
}
}
public class Main {
public static void main(String[] args) {
// Type statique de la variable Animal, type dynamique de l'objet Dog
Animal myDog = new Dog();
// Type statique de la variable Animal, type dynamique de l'objet Cat
Animal myCat = new Cat();
// Type statique de la variable Animal, type dynamique de l'objet Animal
Animal genericAnimal = new Animal();
// Démonstration du polymorphisme
myDog.makeSound(); // Appelle la méthode de Dog
myCat.makeSound(); // Appelle la méthode de Cat
genericAnimal.makeSound(); // Appelle la méthode de Animal
}
}
Dans cet exemple, Dog et Cat héritent de Animal. Les variables myDog, myCat et genericAnimal ont un type statique Animal, mais font référence à des objets de types dynamiques différents (Dog, Cat, Animal). Lorsqu'on appelle la méthode makeSound(), chaque référence exécute l'implémentation appropriée en fonction du type dynamique de l'objet, ce qui constitue du polymorphisme en temps d'exécution.