Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème avec méthode surchargée

6 réponses
Avatar
Zarak
Bonjour, je d=E9bute en Java et l=E0 j'ai une erreur que je ne comprends
pas du tout concernant une m=E9thode surcharg=E9e.

J'ai indiqu=E9 l'erreur dans le main.=20
L'instance "p" de Point2 (h=E9rit=E9e de Point) ne veut pas prendre la
m=E9thode surcharg=E9e "d=E9place" sans argument de Point2, elle accepte
juste la m=E9thode avec arguments de Point.=20
Pourquoi ?=20
Merci d'avance.

public class Helloworld=20
{

public static void main(String[] args){
Point p =3D new Point2();
p.deplace(); /* ERREUR ICI */=20
System.out.println(p.px + " " + p.py); =20
}
}

class Point{
int px,py;
=20
Point(){}
=20
Point(int x, int y){
px =3D x;
py =3D y;
}
=20
void deplace(int dx, int dy){
px +=3D dx;
py +=3D dy;
}
}

class Point2 extends Point{
=20
Point2(){
px =3D 4;
py =3D 9;
}
=20
void deplace(){}
}

6 réponses

Avatar
ownowl
Zarak a écrit :
Bonjour, je débute en Java et là j'ai une erreur que je ne comprends
pas du tout concernant une méthode surchargée.

J'ai indiqué l'erreur dans le main.
L'instance "p" de Point2 (héritée de Point) ne veut pas prendre la
méthode surchargée "déplace" sans argument de Point2, elle accepte
juste la méthode avec arguments de Point.
Pourquoi ?
Merci d'avance.

public class Helloworld
{

public static void main(String[] args){
Point p = new Point2();
p.deplace(); /* ERREUR ICI */
System.out.println(p.px + " " + p.py);
}
}

class Point{
int px,py;

Point(){}

Point(int x, int y){
px = x;
py = y;
}

void deplace(int dx, int dy){
px += dx;
py += dy;
}
}

class Point2 extends Point{

Point2(){
px = 4;
py = 9;
}

void deplace(){}
}



bonjour
c'est normal, une méthode surchargée se doit de comporter les mêmes
paramètres.
dans ton exemple tu appel la méthode deplace() sur un object Point, hors
cette méthode n'existe pas dans la classe Point

Olivier
Avatar
Sylvain SF
Zarak wrote on 03/09/2008 15:29:
Bonjour, je débute en Java et là j'ai une erreur que je ne comprends
pas du tout concernant une méthode surchargée.

Point p = new Point2(); p.deplace(); /* ERREUR ICI */



tu peux surcharger (remplacer) une méthode avec la même signature
(le même prototype) ou surcharger (ajouter) une méthode avec le
même nom et un jeu de paramètres différents.

ici dans Point2, tu ajoutes bien une méthode mais dans le main
tu utilises une référence Point (et non Point2), or cette classe
Point ignore la version sans paramètre; l'appel est donc illégal.

il faudrai quelque chose comme:

class Point {
int px, py;

Point(){
}
Point(int x, int y){
px = x;
py = y;
}
void deplace(){
deplace(0, 0);
}
void deplace(int dx, int dy){
px += dx;
py += dy;
}
}

class Point2 extends Point{
Point2(){
super(4, 9);
}
void deplace(){
deplace(2, 2);
}
}

Sylvain.
Avatar
Zarak
"ownowl" a écrit dans le message de news: 48bea6ac$0$2508$

bonjour
c'est normal, une méthode surchargée se doit de comporter les mêmes
paramètres.



Non, surcharge != redéfinition :)
Avatar
Zarak
"Sylvain SF" a écrit dans le message de news: 48bea95e$0$888$
Zarak wrote on 03/09/2008 15:29:
Bonjour, je débute en Java et là j'ai une erreur que je ne comprends
pas du tout concernant une méthode surchargée.

Point p = new Point2(); p.deplace(); /* ERREUR ICI */



tu peux surcharger (remplacer) une méthode avec la même signature
(le même prototype) ou surcharger (ajouter) une méthode avec le
même nom et un jeu de paramètres différents.

ici dans Point2, tu ajoutes bien une méthode mais dans le main
tu utilises une référence Point (et non Point2),



Ah mais quel idiot, j'ai mal relu mon main...

Enfin, ça me permet d'apprendre que : "Point p = new Point2();"
instancie un Point et non un Point2 :)

Merci.
Avatar
Sylvain SF
Zarak wrote on 03/09/2008 17:17:

Enfin, ça me permet d'apprendre que : "Point p = new Point2();"
instancie un Point et non un Point2 :)



non il instancie bien un Point2 mais le stocke (légitimement)
dans un Point ce qui est valide puisque Point est une super
classe de Point. et tout appel de méthode ira bien chercher
les méthodes surchargées de Point2.

le problème est seulement sur le ligne "Point.deplace()",
cet appel était illégal (pour la compile avant que pour
la résolution virtuelle) car deplace() n'existe pas pour
la classe Point.

Sylvain.
Avatar
Zarak
"Sylvain SF" a écrit dans le message de news: 48beac90$0$957$
Zarak wrote on 03/09/2008 17:17:

Enfin, ça me permet d'apprendre que : "Point p = new Point2();"
instancie un Point et non un Point2 :)



non il instancie bien un Point2 mais le stocke (légitimement)
dans un Point ce qui est valide puisque Point est une super
classe de Point. et tout appel de méthode ira bien chercher
les méthodes surchargées de Point2.

le problème est seulement sur le ligne "Point.deplace()",
cet appel était illégal (pour la compile avant que pour
la résolution virtuelle) car deplace() n'existe pas pour
la classe Point.

Sylvain.



Ok, maintenant j'ai bien compris. Merci pour ces infos.