Polymorphisme en Java : comment surcharger ou remplacer des méthodes

La surcharge et la substitution de méthode sont les deux façons dont Java démontre le polymorphisme. Le polymorphisme vient d'une combinaison de deux mots grecs : « poly » signifiant plusieurs et « morph » signifiant forme. Par conséquent, le polymorphisme permet aux méthodes de prendre de nombreuses formes.

Suivez ce guide pour savoir comment surcharger ou remplacer des méthodes en Java.

Qu'est-ce que la surcharge de méthode ?

La « surcharge de méthode » fait référence à la définition de différentes méthodes dans une classe portant le même nom. Les méthodes doivent avoir des signatures différentes. Une signature de méthode est la combinaison d'un nom de méthode et d'une liste de paramètres. Il n'inclut pas le type de retour.

Le compilateur sait quelle méthode utiliser en vérifiant le type, le nombre de paramètres et l'ordre dans lequel ils sont placés.

Connexes : Exploration de l'héritage dans le langage de programmation Java

La surcharge de méthode démontre le polymorphisme au moment de la compilation. Le polymorphisme à la compilation signifie que le compilateur Java lie un objet à sa fonctionnalité lors de l'exécution. Le compilateur vérifie les signatures des méthodes pour y parvenir.

Ce type de polymorphisme est également connu sous le nom de liaison statique ou précoce.

Voir l'exemple de surcharge de méthode ci-dessous :

 class Arithmetic{
int cube(int x){
return x*x*x;
}
double cube(double x){
return x*x*x;
}
float cube(float x){
return x*x*x;
}
public static void main(String[] args){
Arithmetic myMultiplication = new Arithmetic();
System.out.println("The cube of 5 is " + myMultiplication.cube(5));
System.out.println("The cube of 5.0 is " + myMultiplication.cube(5.0));
System.out.println("The cube of 0.5 is " + myMultiplication.cube(0.5));
}
}

Production:

 The cube of 5 is 125
The cube of 5.0 is 125.0
The cube of 0.5 is 0.125

Le code ci-dessus montre comment obtenir un cube de différents types ( int , double , float ) en utilisant la même méthode.

Généralement, la surcharge de méthode est utilisée pour définir des méthodes similaires avec différents types de paramètres.

Qu'est-ce que la substitution de méthode ?

Cela fait référence à une implémentation différente d'une méthode dans une sous-classe. La méthode doit avoir déjà été définie dans la classe parent.

La méthode de substitution (c'est-à-dire celle de la sous-classe) doit avoir la même signature de méthode que celle de la superclasse. Le type de retour de la méthode de substitution peut être le même ou un sous-type de celui de la superclasse.

La redéfinition est généralement utilisée pour inclure une implémentation spécifique du comportement d'un objet dans la sous-classe.

 class Account{
public void message() {
System.out.println("
Thank you for opening an account with us!");
}
public static void main(String args[]) {
Account myAccount = new Account();
Savings mySavings = new Savings();
FixedDeposit myFixedDepo = new FixedDeposit();
myAccount.message();
mySavings.message();
myFixedDepo.message();
}
}
class Savings extends Account {
public void message() {
System.out.println("
Thank you for opening a Savings account with us!");
}
}
class FixedDeposit extends Account {
public void message() {
System.out.println("
Thank you for opening a Fixed Deposit account with us!");
}
}

Production:

 Thank you for opening an account with us!
Thank you for opening a Savings account with us!
Thank you for opening a Fixed Deposit account with us!

L'exemple ci-dessus montre comment la méthode message() est remplacée dans les sous-classes Savings et FixedDeposit . Différents messages s'afficheront pour les titulaires d'un compte bancaire avec un compte d'épargne et ceux avec un compte de dépôt fixe.

En relation: Ce que vous devez savoir sur l'utilisation de chaînes en Java

Il convient également de noter que la substitution de méthode démontre un polymorphisme d'exécution ou une répartition de méthode dynamique. Cela signifie que la méthode à appeler est résolue à l'exécution plutôt qu'à la compilation.

Pour éviter qu'une méthode ne soit surchargée, utilisez le mot-clé final .

 final void message (){
System.out.println("
Thank you for opening an account with us!");
}

Lorsqu'une sous-classe tente de la remplacer, une erreur de compilation se produit.

Idéalement, toutes les méthodes appelées dans un constructeur devraient être final . Ceci afin d'éviter tout changement involontaire pouvant être causé par les sous-classes.

Parfois, vous devrez peut-être accéder à une méthode remplacée dans la méthode de substitution. Vous pouvez utiliser le mot clé super suivi de l'opérateur point ( . ) et du nom de la méthode dans un tel cas.

Considérez la superclasse Animal .

 class Animal{
public void move() {
System.out.println("
I can move.");
}
}

Ci-dessous se trouve une sous-classe, appelée Fish , qui remplace move() :

 class Fish extends Animal {
public void move() {
System.out.println("
I can swim.");
super.move();
}
public static void main(String args[]){
Fish Tilapia = new Fish();
Tilapia.move();
}
}

Production:

 I can swim.
I can move.

Lorsque vous remplacez une méthode, vous devez également être attentif au modificateur d'accès utilisé. Le modificateur de la sous-classe doit avoir le même niveau de visibilité ou un niveau supérieur à celui de la classe de base. Par exemple, si la méthode de la classe de base est définie comme protected , la méthode de substitution peut être soit protected , soit public .

Code simple avec polymorphisme

Le remplacement et la surcharge de méthode sont importants pour la simplification du code, et un code simple est une bonne pratique.

Pourquoi? Imaginez une base de code complexe avec plus de tenants et de aboutissants que Grand Central Station. Imaginez maintenant qu'un insecte dévastateur commence à détruire votre travail acharné sous vos yeux. Vous devez isoler la source de l'infection et vous devez le faire rapidement.

Bonne chance, vous n'avez pas simplifié votre code… Vous allez maintenant prendre une vraie leçon de cryptographie. Utiliser des structures de données efficaces et faire ce que vous pouvez pour raccourcir le code (par exemple garder DRY à l'esprit) est votre meilleure défense contre une situation comme celle-ci.

La prochaine étape de votre liste d'apprentissage Java devrait être de travailler avec des tableaux. Ce sont des structures de données importantes utilisées pour stocker des lots de points de données.