Qu'est-ce que le polymorphisme en Java ?
En Java, le polymorphisme (polymorphisme) est une caractéristique d'un objet qui permet de modifier le comportement de l'objet sans modifier le code. En termes simples, le polymorphisme signifie qu'une même méthode ou un même opérateur a des méthodes d'implémentation ou des résultats différents. Cette fonctionnalité permet aux objets d'une classe d'être considérés comme des objets d'une autre classe, assurant ainsi la flexibilité et la réutilisabilité du code.
Le polymorphisme est un concept important dans la programmation orientée objet et l'un des concepts de base de la programmation Java. Son rôle n'est pas seulement de rendre le code plus flexible et d'éviter la duplication de code, mais aussi de faciliter la maintenance et l'extension du code.
implémentation polymorphe
Le polymorphisme en Java peut être implémenté de deux manières :
1. Surcharge de méthode (Overload)
En Java, la surcharge de méthode fait référence à la définition de plusieurs méthodes dans une classe qui ont le même nom mais diffèrent par le type ou le nombre de paramètres et peuvent également inclure différents types de retour. Lors de l'appel d'une méthode, le compilateur fera correspondre la méthode correcte en fonction du type, de la quantité et de l'ordre des paramètres réels, et appellera la méthode correspondante.
Par exemple, supposons que nous ayons une classe qui calcule l'aire d'un graphe, nous pouvons définir les trois méthodes suivantes pour cette classe :
public double getArea(double r) {
// 计算圆的面积
}
public double getArea(double w, double h) {
// 计算矩形的面积
}
public double getArea(double a, double b, double c) {
// 计算三角形的面积
}
Lorsque nous appelons la méthode getArea, le compilateur correspondra à la méthode appropriée en fonction des paramètres passés, par exemple :
double area1 = getArea(3.0); // 调用计算圆的面积的方法
double area2 = getArea(2.0, 3.0); // 调用计算矩形的面积的方法
double area3 = getArea(3.0, 4.0, 5.0); // 调用计算三角形的面积的方法
C'est ainsi que la surcharge de méthode réalise le polymorphisme.
2. Réécriture de méthode (Override)
La réécriture de méthode en Java signifie qu'une sous-classe redéfinit une méthode avec la même affectation, le même type de retour et le même nom définis dans la classe parent. La sous-classe remplace la méthode dans la classe parent, de sorte que lorsque la méthode est appelée, la méthode dans la sous-classe est en fait appelée à la place de la méthode dans la classe parent.
Par exemple, supposons que la classe parent a une méthode appelée getPrice() et que sa valeur de retour est un type double, qui est utilisé pour obtenir le prix d'un article. Maintenant, il y a une sous-classe qui doit calculer le prix réduit du produit, puis la méthode getPrice() peut être réécrite pour l'atteindre.
class Product {
public double getPrice() {
// 获取商品价格
}
}
class DiscountProduct extends Product {
public double getPrice() {
// 计算打折价格
}
}
Lorsque nous appelons la méthode getPrice de DiscountProduct, la méthode de la sous-classe est en fait appelée à la place de la méthode de la classe parent. C'est ainsi que le remplacement de méthode réalise le polymorphisme.
Scénarios d'application polymorphe
Le polymorphisme peut améliorer l'évolutivité et la maintenabilité du code. En Java, le polymorphisme est souvent utilisé de la manière suivante :
1. Héritage
L'héritage est la condition préalable au polymorphisme. La sous-classe hérite de la classe parent, réécrit la méthode dans la classe parent dans la sous-classe et réalise le polymorphisme de la méthode.
class Animal {
public void eat() {
System.out.println("Animal is eating");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("Dog is eating");
}
}
Dans cet exemple, la classe Dog hérite de la classe Animal et remplace la méthode eat. Lorsque nous appelons la méthode Eat de Dog, la méthode Eat de Dog est en fait appelée.
2. Interface
Les interfaces sont également capables de polymorphisme. Les méthodes définies dans une interface peuvent être implémentées de différentes manières par des classes implémentant l'interface. De cette façon, lors de l'utilisation d'objets de ces classes, nous pouvons utiliser le type de l'interface pour y faire référence et appeler les méthodes qu'elle implémente.
interface Flyable {
void fly();
}
class Bird implements Flyable {
public void fly() {
System.out.println("Bird is flying");
}
}
class Plane implements Flyable {
public void fly() {
System.out.println("Plane is flying");
}
}
Dans cet exemple, les classes Bird et Plane implémentent à la fois l'interface Flyable et implémentent la méthode fly. Lorsque nous appelons la méthode fly de Bird et Plane, nous appelons en fait la méthode fly implémentée par eux.
3. Génériques
Les génériques de Java peuvent également atteindre le polymorphisme. Les génériques peuvent faire en sorte qu'un type générique ait différentes méthodes et comportements sous différents paramètres d'instanciation.
class Generic<T> {
public void print(T t) {
System.out.println("Generic type: " + t.getClass().getName());
}
}
Dans cet exemple, nous définissons une classe générique Generic qui peut accepter différents paramètres de type. Lorsque nous instancions cette classe avec différents types, elle se comporte différemment.
Generic<String> g1 = new Generic<>();
Generic<Integer> g2 = new Generic<>();
g1.print("Hello World"); // 输出Generic type: java.lang.String
g2.print(123); // 输出Generic type: java.lang.Integer
Dans cet exemple, g1 est une classe Generic instanciée dont le paramètre de type est String.Lorsque nous appelons sa méthode d'impression, elle affichera "Type générique : java.lang.String". De même, le paramètre de type de g2 est Integer, et lorsque nous appelons sa méthode d'impression, il affichera "Type générique : java.lang.Integer".
Avantages du polymorphisme
Le polymorphisme présente de nombreux avantages dans la programmation orientée objet, comme suit :
1. Améliorer la réutilisabilité du code
Le polymorphisme sépare l'implémentation de la méthode de l'implémentation spécifique, ce qui améliore la réutilisabilité du programme. Nous n'avons besoin que de réécrire la méthode lorsque cela est nécessaire et de fournir de nouvelles fonctions pour le programme sans affecter la fonction d'origine du programme.
2. Améliorer l'évolutivité du code
Le polymorphisme permet à une classe d'interagir avec d'autres classes différentes, ce qui rend le programme plus évolutif.
3. Facilitez la maintenance des programmes
Le polymorphisme peut rendre les modules du programme plus indépendants. Lorsqu'une fonction doit être modifiée, seule l'implémentation de la fonction doit être modifiée sans affecter les autres parties du programme.
4. Rendre le programme plus flexible
Le polymorphisme nous permet de déterminer la méthode ou l'objet à utiliser lors de l'exécution, ce qui rend le programme plus flexible.
Résumer
Le polymorphisme est un concept important en Java, qui peut être réalisé par la surcharge de méthodes, le remplacement de méthodes, les interfaces et les génériques. Le polymorphisme peut améliorer l'évolutivité, la réutilisabilité, la maintenabilité et la flexibilité du programme, rendant le programme plus robuste et élastique. Dans le développement actuel, le polymorphisme est une idée de programmation très importante, qui nous oblige à la comprendre et à la maîtriser plus profondément.