Introduction
La substitution et la surcharge sont des concepts fondamentaux en programmation Java. Ce sont les moyens de mettre en œuvre le polymorphisme dans nos programmes Java. Le polymorphisme est l’un des concepts de la POO (Programmation Orientée Objet).

Lorsque la signature de la méthode (nom et paramètres) est identique dans la superclasse et la classe enfant, on parle de substitution. Lorsque deux méthodes ou plus dans la même classe ont le même nom mais des paramètres différents, on parle de surcharge.
Comparaison entre la substitution et la surcharge
Overriding | Overloading |
---|---|
Implements “runtime polymorphism” | Implements “compile time polymorphism” |
The method call is determined at runtime based on the object type | The method call is determined at compile time |
Occurs between superclass and subclass | Occurs between the methods in the same class |
Have the same signature (name and method arguments) | Have the same name, but the parameters are different |
On error, the effect will be visible at runtime | On error, it can be caught at compile time |
Exemple de substitution et de surcharge
Voici un exemple de surcharge et de substitution dans un programme Java :
package com.journaldev.examples;
import java.util.Arrays;
public class Processor {
public void process(int i, int j) {
System.out.printf("Processing two integers:%d, %d", i, j);
}
public void process(int[] ints) {
System.out.println("Adding integer array:" + Arrays.toString(ints));
}
public void process(Object[] objs) {
System.out.println("Adding integer array:" + Arrays.toString(objs));
}
}
class MathProcessor extends Processor {
@Override
public void process(int i, int j) {
System.out.println("Sum of integers is " + (i + j));
}
@Override
public void process(int[] ints) {
int sum = 0;
for (int i : ints) {
sum += i;
}
System.out.println("Sum of integer array elements is " + sum);
}
}
Substitution
La méthode process()
et les paramètres int i, int j
dans Processor
sont redéfinis dans la classe enfant MathProcessor
. Ligne 7 et ligne 23:
public class Processor {
public void process(int i, int j) { /* ... */ }
}
/* ... */
class MathProcessor extends Processor {
@Override
public void process(int i, int j) { /* ... */ }
}
Et la méthode process()
et int[] ints
dans Processor
sont également redéfinis dans la classe enfant. Ligne 11 et ligne 28:
public class Processor {
public void process(int[] ints) { /* ... */ }
}
/* ... */
class MathProcessor extends Processor {
@Override
public void process(Object[] objs) { /* ... */ }
}
Surchargement
La méthode process()
est surchargée dans la classe Processor
. Lignes 7, 11 et 15:
public class Processor {
public void process(int i, int j) { /* ... */ }
public void process(int[] ints) { /* ... */ }
public void process(Object[] objs) { /* ... */ }
}
Conclusion
Dans cet article, nous avons couvert le remplacement et la surcharge en Java. Le remplacement se produit lorsque la signature de la méthode est la même dans la superclasse et la classe enfant. La surcharge se produit lorsque deux méthodes ou plus dans la même classe ont le même nom mais des paramètres différents.
Source:
https://www.digitalocean.com/community/tutorials/overriding-vs-overloading-in-java