Le compilateur Java ne se plaint pas lorsque je substitue une méthode protected
à une méthode public
. Qu'est-ce qui se passe vraiment ici? Remplace-t-il ou masque-t-il la méthode parente puisque celle-ci a une visibilité inférieure?
Une sous-classe peut toujours élargir le modificateur d'accès, car il s'agit toujours d'une substitution valide pour la super-classe. D'après la spécification Java relative à Exigences en matière de substitution et de masquage :
Le modificateur d'accès (§6.6) d'une méthode de substitution ou de masquage doit fournir au moins autant d'accès que la méthode de substitution ou de masquage, comme suit:
- Si la méthode remplacée ou masquée est publique, la méthode de substitution ou de masquage doit être publique; sinon, une erreur de compilation survient.
- Si la méthode substituée ou masquée est protégée, la méthode de substitution ou de masquage doit être protégée ou publique; sinon, une erreur de compilation survient.
- Si la méthode remplacée ou masquée a un accès par défaut (package), la méthode de substitution ou de masquage ne doit pas être privée; sinon, une erreur de compilation survient.
Du point de vue d’une classe externe, la méthode publique n’est qu’une nouvelle méthode, et non une méthode de substitution, car la classe externe n’a de toute façon pas accès à la méthode protégée.
En revanche, la visibilité réduite n'est pas autorisée car la classe externe peut toujours utiliser une référence du type d'une super-classe pour référencer un objet de la sous-classe et appeler la même méthode.
La visibilité affecte uniquement l'accessibilité externe. Étant une méthode public
, toute classe externe peut l'appeler.
Le niveau d'accès de la méthode de remplacement n'affecte pas la visibilité de la méthode d'origine. Après substitution, quel que soit le niveau d’accès, il est uniquement possible d’accéder à la méthode d’origine en appelant super
dans la sous-classe.