Erreur dans le tutoriel "Apprenez à programmer en Java"

a marqué ce sujet comme résolu.

Hello, l'auteur du tuto étant injoignable, je post donc sur le forum.

Dans le chapitre concernant l'héritage, lors de l'explication de ce qu'est une méthode finale, l'auteur dit : Une méthode signée final est figée, vous ne pourrez jamais la redéfinir , ce qui est vrai.

Mais ensuite, dans un morceau de code, l'auteur écrit :

1
2
3
public final int maMethode(){
  //Méthode ne pouvant pas être surchargée
}

C'est faux, il est possible de surcharger une méthode finale :) Voili Voilou

+3 -1

Non, mais je pense clairement qu'il essaie de faire mélanger la surcharge "overloading" et la surcharge "overriding". Comme le mot clef final n'a d'effet que sur la virtualité de la fonction, il est évident que l'overloading n'est pas retiré. Mais c'est totalement hors contexte par rapport à ce que dit le cours.

https://openclassrooms.com/forum/sujet/erreur-dans-le-cours-apprenez-a-programmer-en-java

La surcharge (overload), c'est créer une méthode du même nom, mais en modifiant le type, l'ordre ou le nombre des paramètres.

La redéfinition (override), c'est créer une méthode de remplacement, en conservant la même signature (nom, paramètres et type de retour) .

Une méthode déclarée final ne peut pas être redéfinie dans une classe fille, mais elle peut être surchargée.

Dans le tuto, l'auteur explique clairement la différence entre une redéfinition (ce qu'il appel méthode polymorphe) et la surcharge.

Dans la doc d'Oracle : You use the final keyword in a method declaration to indicate that the method cannot be overridden by subclasses.

On parle bien de redéfinition, pas de surcharge.

+1 -0

C'est pas du tout le mot "redéfinition" qu'on m'a appris durant mes études.

Et c'est bien la première fois que quelqu'un me le sort.

artragis

En clair la redéfinition c'est un "remplacement", si tu as une classe fille qui redéfinie une méthode x de sa classe mère, alors lors de l'appel de cette méthode par un objet du type fille, c'est la méthode de la classe fille qui sera appelée. Si la méthode n'avait pas été redéfinie, c'est la méthode de la classe mère qui aurait été appelée. C'est ce que l'auteur appel "méthode polymorphe".

Ca diffère de la surcharge. Si tu prends ton IDE préféré, et que tu code une méthode final, tu verra qu'il est parfaitement possible de la surcharger, mais qu'il est impossible de la redéfinir.

+1 -0

En clair la redéfinition c'est un "remplacement", si tu as une classe fille qui redéfinie une méthode x de sa classe mère, alors lors de l'appel de cette méthode par un objet du type fille, c'est la méthode de la classe fille qui sera appelée. Si la méthode n'avait pas été redéfinie, c'est la méthode de la classe mère qui aurait été appelée. C'est ce que l'auteur appel "méthode polymorphe".

Je comprends ta logique. C'est juste que quand tu as fait du C++ ou du C#tu es habitué à deux types de méthodes les méthodes virtuelles et les méthodes non virtuelles.

La redéfinition, c'est le mot (aussi utilisé en anglais "redefine") qui est utilisé quand une classe fille recrée une méthode non virtuelle. Par défaut on parle juste d'overriding ou au pire de polymorphisme voire de "surcharge dynamique" (celle-là non plus je l'ai pas beaucoup entendue, mais on me l'a déjà faite).

Oui le terme n'a pas nécessairement le même sens selon que l'on code dans tel ou tel langage.

Mais dans le contexte du langage Java, écrire qu'une méthode déclarée final ne peut pas être surchargée, c'est faux, car il y a une différence notable entre la redéfinition (l'écrasement si on veut) et la surcharge. Au final ce n'est même pas une question de logique ou d'interprétation.

En plus c'est relativement ambigue, car en lisant le chapitre, on voit que l'auteur fait clairement la différence entre surcharge et redéfinition (ce qu'il appelle polymorphisme).

+0 -0

Voilà la doc' d'Oracle sur final. C'est dommage pour le coup d'affirmer des choses de manière péremptoire sans citer la documentation correspondante.

Grimur

C'est faux, il est possible de surcharger une méthode finale :) Voili Voilou

non.

artragis

Bref, non je n'arrive pas sur le forum en racontant tout et n'importe quoi sans la moindre vérification préalable. Ce que je trouve péremptoire moi, c'est qu'on me reproche de l'être en me lâchant un lien vers la doc, visiblement très mal lu, et qui plus est, confirme mes dires.

Il y a donc effectivement une erreur : Image utilisateur

Une méthode déclarée final peu parfaitement être surchargée.

En attendant une correction sur ZDS, Cordialement

+2 -0

Je comprends ta logique. C'est juste que quand tu as fait du C++ ou du C#tu es habitué à deux types de méthodes les méthodes virtuelles et les méthodes non virtuelles.

La redéfinition, c'est le mot (aussi utilisé en anglais "redefine") qui est utilisé quand une classe fille recrée une méthode non virtuelle. Par défaut on parle juste d'overriding ou au pire de polymorphisme voire de "surcharge dynamique" (celle-là non plus je l'ai pas beaucoup entendue, mais on me l'a déjà faite).

artragis

En anglais on dit bien override et overload en C++. Et redefine est un terme non-officiel (N3290 et suivants sont librement téléchargeables) hors contexte des définitions de types, que je découvre, et donc sujet à ambiguïtés – Bruce Eickel semble l'employer, et je vois sur SO qui croient que redefine fait allusion au seul masquage de fonctions. Il y a pas loin d'une 20aine d'années, sur fclc++ "supplanter" avait été proposée en alternative à "redéfinir" – il faut dire que le choix de certains auteurs d'utiliser surdéfinir pour traduire overload n'aide pas – mais nous étions conscient qu'il était trop tard et que la traduction officielle de override était déjà entérinée : "redéfinir".

Quand j'enseigne/m'exprime, je donne toujours le terme officiel "redéfinir", et explique en disant que l'on supplante une définition par une nouvelle.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte