Vous êtes sur la page 1sur 6

15/04/2020

POO en Java
Ch. IV

Surcharge des méthodes

On parle de surcharge (overload) ou encore de surdéfinition


lorsqu’un même symbole possède plusieurs significations
différentes entre lesquelles on choisit en fonction du contexte.
Par exemple, dans des expressions arithmétiques telles que a+b :
la signification du symbole + dépend du type des variables a et b.

En Java , on peut surcharger une méthode, c’est-à-dire,


définir (dans la même classe) plusieurs méthodes qui ont le
même nom mais pas la même signature (différenciées par le
type des arguments)

1
15/04/2020

 Une classe peut contenir plusieurs méthodes de même


fonctionnalité mais d’arguments différents.
 Par exemple une méthode conçue pour sortir une représentation
textuelle de son argument.
 Cette méthode sera nommée print()
 La méthode d’impression pour imprimer différents types de
données tels que int, float et String nécessitent une mise en forme
différente et probablement un traitement différent.
 Vous pourriez créer ces méthodes baptisées respectivement:
printint(int arg), printfloat(float arg) et printString(String arg)

Cette solution est néanmoins fastidieuse.

 Java permet de réutiliser un même nom de méthode pour plusieurs


fonctionnalités.
 Cette solution ne fonctionne que si le compilateur peut distinguer quelle
méthode est effectivement requise.
 Dans le cas des trois méthodes d’impression, il est possible de faire cette
distinction sur la base des types des arguments.
 En réutilisant le nom de la méthode, nous obtenons les trois méthodes ci-après:

public void print(int i)


public void print(float f)
public void print(String s)

 Lorsque vous écrivez du code pour appeler l’une de ces méthodes, la méthode
appropriée est choisie en fonction du type des arguments que vous fournissez.

2
15/04/2020

Considérons l’exemple1 suivant où la classe Affichage est


dotée de 3 méthodes print():

class Affichage{
public void print(int i){
System.out.println("nombre entier =" + i);
}
public void print (float f){
System.out.println("nombre flottant =" + f);
}
public void print (String s){
System.out.println("chaine de caractères =" + s);
}
}

Considérons l’exemple2 suivant où la classe ClasseTest est


dotée de 2 méthodes calcMoyenne:

- La première a deux arguments de type double


public double calcMoyenne(double m1, double m2) {…}

- La deuxième a trois arguments de type double


public double calcMoyenne(double m1, double m2, double m3) {…}

3
15/04/2020

class ClasseTest{
public double calcMoyenne(double m1, double m2) {
return (m1+m2)/2;
}
public double calcMoyenne(double m1, double m2, double m3) {
return (m1+m2+m3)/3;
}
}

public class TestSurcharge {


public static void main(String[] args) {
ClasseTest objA=new ClasseTest();
System.out.println("Moy1="+objA.calcMoyenne(10., 12.2));
System.out.println("Moy2="+objA.calcMoyenne(10., 12.6, 8.));
}
}

Considérons maintenant l’exemple3 suivant où la classe Point


est dotée de 3 méthodes déplace:
- La première a deux arguments de type int
public void deplace (int dx, int dy) { x+=dx; y+=dy; }

- La deuxième a un seul argument de type int


public void deplace (int dx) { x+=dx; }

- La troisième a un seul argument de type short


public void deplace (short dx) { x+=dx; }

4
15/04/2020

class Point {
private int x,y;
public void initialise (int abs, int ord){ x=abs; y=ord; }
public void deplace (int dx, int dy) { x+=dx; y+=dy; }
public void deplace (int dx) { x+=dx; }
public void deplace (short dx) { x+=dx; }
}
public class Surcharge {
public static void main(String arg[]) {
Point a=new Point();
a.initialise(1,2);
a.deplace(1,3); // appel deplace (int,int)
a.deplace(2); // appel deplace (int)
short p=3;
a.deplace(p); // appel deplace (short)
byte b=2;
a.deplace(b); // appel deplace(short) après conversion de b en short
}
}
9

En Java, il est interdit de surcharger une méthode


en changeant le type de retour uniquement:
c’est-à-dire ne différencier les 2 méthodes que par
leur type retour.
Par exemple, on ne peut pas avoir les 2 méthodes
suivante dans une classe :

int division(int, int); // division entière


float division(int, int); // division réelle

10

5
15/04/2020

En Java, il est interdit de surcharger une méthode


en changeant le type de retour uniquement:
Exemple:
class Affichage{
public float convertir(int i){
return((float)i);
}
public double convertir(int i){
return((double)i);
}
}
Résultat à la compilation :
Affiche.java:5: Methods can't be redefined with a different
return type: double
convert(int) was float convert(int)
public double convert(int i){
^ 1 error
11