Accès protégé membre de différents paquets dans Java - une curiosité
package packageOne;
public class Base
{
protected void display(){
system.out.println("in Base");
}
}
package packageTwo;
public class Derived extends packageOne.Base{
public void show(){
new Base().display();//this is not working throws compilation error that display() from the type Base is not visible
new Derived().display();//is working
display();//is working
}
}
Les deux paquets sont dans deux fichiers différents. Mais pourquoi ce comportement?
source d'informationauteur abson
Vous devez vous connecter pour publier un commentaire.
http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.6
La motivation est probablement de la manière suivante. Si
obj
est unS
classeS
dispose de suffisamment de connaissances de son fonctionnement interne, il a le droit de manipuler ses membres, et il peut le faire en toute sécurité.Si
obj
n'est pas unS
c'est probablement un autre sous-classeS2
deC
quiS
n'a aucune idée de.S2
peut-être pas encore né quandS
est écrit. PourS
à manipulerS2
protégées internes est assez dangereux. Si cela est permis, à partir deS2
point de vue, il n'est pas de savoir qui va altérer la protection des éléments internes et comment, de ce faitS2
de travail très difficile de raisonner sur son propre état.Maintenant, si
obj
estD
etD extends S
est-il dangereux pourS
pour accéder àobj.member
? Pas vraiment. CommentS
utilisemember
est un partage des connaissances deS
et toutes ses sous-classes, y comprisD
.S
comme la super-classe a le droit de définir les comportements et lesD
que la sous-classe a l'obligation d'accepter et de respecter.Pour faciliter la compréhension, la règle devrait vraiment être simplifiée
obj
's (statique) de type à être exactementS
. Après tout, c'est très inhabituel et inapproprié pour la sous-classeD
à apparaître dansS
. Et même si il arrive, que le type statique deobj
estD
notre règle simplifiée peut traiter facilement par upcasting:((S)obj).member
protected
permet l'accès à partir de sous-classes et d'autres classes du même package. C'est pourquoi touteDerived
instance de classe peut accéder à la méthode protégée dansBase
.L'autre crée une
Base
instance (et non pas unDerived
exemple!!). Et l'accès aux protégés méthodes de cette instance est uniquement autorisée à partir d'objets du même package.-> permisparce que l'appelant, une instance de
Derived
a accès aux membres protégés et les champs de ses sous-classes, même si elles sont différentes des paquets-> permisparce que vous appelez la méthode sur une instance de
Derived
et que cette instance a accès à l'protégé méthodes de ses sous-classes-> pas permis en raison de l'appelant (le
this
exemple) de la classe n'est pas définie dans le même colis comme laBase
classe, doncthis
ne pouvez pas accéder à la méthode protégée. Et il n'a pas d'importance - comme on le voit, que le sous-classes d'une classe à partir de ce paquet. Que backdoor est fermé 😉Protégé l'accès a certaines règles particulières qui sont détaillées dans le Java Langage De Spécification:
Il crée un objet de Base, et ensuite essaye de l'appeler (à l'affichage).
Évidemment, ça ne marchera pas, parce que l'affichage() sur la Base est protégée.
D'abord penser, c'est que vous pouvez utiliser
protected
Object
dans toute la vaisselle, mais seulement des non-sous-classe ne peut pas accéder membre protégé de l'autre classe. cela signifie que vous ne pouvez pas l'utiliser directement. vous recevez d'abord que l'obj et d'utiliser ensuite.et nous avons une autre classe comme
dans cette affaire, qu'il faut s'étend de la classe de membre protégé et ensuite utiliser vous ne pouvez pas l'utiliser directement.
C'est le but de comportement. protégé signifie que l'héritage de classes et même les classes du package pouvez voir la méthode. Donc, c'est ce que vous voyez.
Cela pourrait être une réponse directe à votre question, mais je ne vois pas pourquoi vous appelez nouveau
Base().display();
. Peut-être ce que tu veux dire danssuper.display();
.Dans ce cas, vous êtes en fait en utilisant la méthode héritée, mais juste parce que vous êtes hériter une classe, cela ne signifie pas que vous avez accès à la classe protégé méthodes (qui, par définition, ne sont visibles que pour les super-classes).
La différence est sur une affaire (votre exemple) vous essayez d'accéder à une méthode protégée à partir d'une instance d'une classe que vous avez hérité. Dans mon exemple, vous pouvez accéder à la méthode protégée par héritage.
En résumé: vous pouvez accéder à la méthode par succession de contexte.
Pourquoi?
Il permet aux programmeurs de flexibilité dans le choix des fonctions ne peuvent être utilisées ou prolongées par les descendants directs.
Un membre protégé ou le constructeur d'un objet peut être accessible depuis l'extérieur de l'emballage dans lequel elle est déclarée que par le code qui est responsable de la mise en œuvre de cet objet.
display
n'est pas une méthode statique à l'intérieur de la Base. Donc, vous devez d'abord créer une instance de la Base, puis l'affichage d'appel.