Pourquoi ne puis-je remplacer une méthode protégée avec la méthode publique?
Le compilateur Java ne se plaint pas quand je remplace une protected méthode avec un public méthode. Ce qui se passe réellement ici? Est-il de la substitution ou de masquage de la méthode parent depuis la méthode parent a une faible visibilité?
Une sous-classe peut toujours élargir le modificateur d'accès, car il est encore valide de substitution pour la super-classe. À partir de la spécification de Java sur Exigences Impérieuses et Cacher:
Le modificateur d'accès (§6.6) d'une substitution ou de cacher méthode doit fournir au moins autant d'accès que le substituée ou de caché méthode, comme suit:
Si le substituée ou de caché méthode est publique, alors le principal ou le masquage de la méthode doit être publique; sinon, une erreur de compilation se produit.
Si le substituée ou de caché méthode est protégé, le remplacement ou le masquage de la méthode doit être protégé ou public; sinon, une erreur de compilation se produit.
Si le substituée ou cachés de la méthode par défaut (package), le principal ou le masquage de la méthode ne doit pas être privé; sinon, une erreur de compilation se produit.
Du point de vue d'une classe externe, la méthode publique est juste une nouvelle méthode, pas une méthode de remplacement, depuis la classe externe ne peut pas accéder à la méthode protégée de toute façon.
D'autre part, l'abaissement de la visibilité n'est pas autorisée, car la classe externe peut toujours utiliser une référence du type d'une super-classe pour faire référence à un objet de la sous-classe et l'appel à la même méthode.
Ce n'est pas tout à fait exact que la classe externe ne serait pas au courant de la méthode protégée, en supposant que la même visibilité. Mais si la sous-classe d'accroître la visibilité, alors c'est maintenant exposés par elle.
La visibilité n'affecte accessibilité externe. Être un public méthode externe de classe peuvent appeler.
Niveau d'accès de la méthode de remplacement n'affecte pas la visibilité de la méthode d'origine. Après la remplacer, à tout les niveaux d'accès, la méthode originale qui ne peut être accessible en appelant super dans la sous-classe.
Une sous-classe peut toujours élargir le modificateur d'accès, car il est encore valide de substitution pour la super-classe. À partir de la spécification de Java sur Exigences Impérieuses et Cacher:
OriginalL'auteur Harmlezz
Du point de vue d'une classe externe, la méthode publique est juste une nouvelle méthode, pas une méthode de remplacement, depuis la classe externe ne peut pas accéder à la méthode protégée de toute façon.
D'autre part, l'abaissement de la visibilité n'est pas autorisée, car la classe externe peut toujours utiliser une référence du type d'une super-classe pour faire référence à un objet de la sous-classe et l'appel à la même méthode.
OriginalL'auteur Rohan
La visibilité n'affecte accessibilité externe. Être un
public
méthode externe de classe peuvent appeler.Niveau d'accès de la méthode de remplacement n'affecte pas la visibilité de la méthode d'origine. Après la remplacer, à tout les niveaux d'accès, la méthode originale qui ne peut être accessible en appelant
super
dans la sous-classe.OriginalL'auteur Mikael Lindlöf