Protégé des variables peut être consulté dans la Classe Enfant ou de l'Enfant Objet
Est le protected
variable d'un parentObject
être consulté à partir de n'importe quel enfant Object
? ou peut être uniquement accessible uniquement par le particulier childObject
? J'ai un scénario qui exprime clairement mon doute.
J'ai deux classes ParentClass
et ChildClass
. ParentClass
est parent de ChildClass
. J'ai un protected
variable dans ParentClass
nommé protVar
. Il est de type Object
. Ensuite, j'ai créer deux Object
s comme suit.
ParentClass p1 = new ParentClass();
ChildClass c1 = new ChildClass();
c1.callMethod(p1); //Here I want to access protected variable of p1 which is a separate object and Not initialized within c1 as super()
Maintenant, je vais être en mesure d'accéder à la protVar
de p1
de c1
?
u peut accéder aux variables protégés de la super-classe sous-classe
Est-il vraiment si difficile de simplement essayer?
Aussi ce que u veux essayer n'est pas claire.En passant un objet de la classe parente dans la sous-classe..
Je veux juste si il n'y a aucune explication technique de l'essai et de l'erreur de mode..
Ce n'est pas un téléphone mobile. Merci de faire un effort pour la vitesse correctement et en général pour écrire clairement l'anglais standard.
Est-il vraiment si difficile de simplement essayer?
Aussi ce que u veux essayer n'est pas claire.En passant un objet de la classe parente dans la sous-classe..
Je veux juste si il n'y a aucune explication technique de l'essai et de l'erreur de mode..
Ce n'est pas un téléphone mobile. Merci de faire un effort pour la vitesse correctement et en général pour écrire clairement l'anglais standard.
OriginalL'auteur Santron Manibharathi | 2014-03-03
Vous devez vous connecter pour publier un commentaire.
Avertissement: la réponse est copié à partir de ma réponse à une autre question. Toutefois, aucune réponse de cette question est accepté. Je crois qu'il a également répondre à cette question donc je copie le contenu avec quelques retouches ici.
protected
est un peu intéressant en Java. Bien que nous dit toujours "protégé" donne l'accès à la sous-classe de paquet différent, il n'est pas l'ensemble de l'image.Par exemple, si vous avez
Child
l'extension deParent
, et il est un membre protégé dansParent
. Ce que vous pouvez faire dansChild
est à accès protégé membre deChild
, mais même pas que les membres protégés deParent
. Sonne un peu étrange de droite même si ils sons de la même chose?Cité du Noyau de Java 9e Édition:
(Gestionnaire de classe s'étend de l'Employé, et il y a un hireDay protégé membre de l'Employé et le Gestionnaire et l'Employé sont situés dans DIFFÉRENTS package)
Par exemple,
Ce qui signifie, membre protégé permettre à l'enfant de la classe à partir d'un autre paquet à travers la référence de l'enfant de la classe (soit
this
, ou une autre référence qui est un enfant de la classe)Et, être spécifique à l'OP de la réponse: si
callMethod
est déclaré dansChildClass
, alors NON, vous ne pouvez pas le faire et il ne sera même pas compiler. Toutefois, sicallMethod
est déclaré dansParentClass
alors tout est bien, parce que c'est tout simplementParentClass
accès protégé membre d'unParentClass
instance.Mise à jour:
Donné critiques dans les commentaires, je pense qu'il vaut la peine d'aller à JLS pour voir ce qu'il disent:
(Cité de http://docs.oracle.com/javase/specs/jls/se8/html/jls-6.html#jls-6.6.2.1 sur l'Accès à un Membre protégé, deuxième puce)
C'est essentiellement ce que j'ai tenté de livrer dans la réponse:
Dans
Manager
classe,manager.hireDay
fonctionne parce quemanager
est une expression primaire, et l'accès est autorisé, car le type demanager
estManager
ou sous-classe deManager
.Sur la base d'JLS, pourquoi
manager.hireDay
œuvres NE ont une relation avec le type demanager
(de même type).manager.hireDay
ne fonctionne pas parce que vous avez accès protégé membre de l'instance du même type. Une foismanager
héritehireDay
,hireDay
est maintenant un champ protégé deManager
classe. Par conséquent , même un complet dans une classe différente ,Entrepreneur
sera en mesure d'accéder à hireday l'aide d'une instance deManager
(manager.hireDay
) aussi longtemps queEnterpreneur
appartient à la même package queManager
.Je crois que vous n'avez pas à comprendre le raisonnement derrière. Quand nous parlons de l'
protected
dans l'exemple ci-dessus, bien sûr, nous devons nous assurer que les classes sont de différentes paquet, de sorte que vous n'avez pas gain de l'accessibilité par le biais de l'emballage/par défaut (qui est aussi une partie deprotected
). Si les choses sont mis sous le même package,protected
ou forfait/par défaut ne fait aucune différence. Et, dans l'exemple ci-dessus,manager.hireDay
fonctionne. Veuillez lire à nouveau pour vous assurer de comprendre 🙂Je ne dis pas qu'il NE fonctionne PAS. Je suis en train de dire que l'explication que vous donnez pour expliquer pourquoi cela fonctionne ( son instance du même type) est erroné. Dans l'explication que j'ai donné , je suis encore en train d'examiner ,
Employee
etManager
appartenir à différentes paquet. CependantEnterpreneur
appartient à la même package queManager
"Dans la deuxième partie , responsable.hireDay ne fonctionne pas car " qu'est ce que vous avez écrit. Et, je ne comprends les gens peuvent utiliser différentes façon de comprendre ce comportement, mais ce que j'ai écrit (qui est basée sur un livre) est l'effet réel, vous pourrez observer (c'est à dire vous ne pouvez accéder thru ref de la même classe, compte tenu de classe parent dans les différentes).
et, si vous êtes intéressés, vous pouvez vérifier JLS: docs.oracle.com/javase/specs/jls/se8/html/... , le 2ème point: Si l'accès est par l'accès à un champ d'expression de E. Id, ou une invocation de méthode d'expression E. Id(...), ou une méthode de référence de l'expression E :: Id, où E est une expression Primaire (§15.8), l'accès est autorisé si et seulement si le type de E est S ou une sous-classe de S. qui est ce qui est décrit dans la réponse
OriginalL'auteur Adrian Shum
Oui, une classe dérivée peut accéder à un protégé de la variable dans une classe de base via les deux "super" et une autre référence à la classe de base.
MODIFIER Il convient de noter que je suis ici, en supposant que le même package que vous n'avez pas d'état de rien à propos de paquets différents. Les règles sont différentes contraire.
Je crois que les deux EJP et @Seelenvirtuose sont mauvais. Voilà j'ai répondu à une question similaire récemment: stackoverflow.com/a/21929828/395202
Non, je ne suis pas mal. Vous ne pouvez pas accéder à des champs protégés à partir d'un objet que vous venez d'avoir une référence (par exemple, par le biais d'un simple variable). Mais gardez à l'esprit que ce n'est vrai que, si votre code d'accès réside dans un autre package. Si c'est le même package, vous pouvez accéder aux champs protégés, comme protégé comprend package de visibilité.
Cette réponse est fausse. : ( Voir l'exemple.
Il n'y a rien dans la question sur les différents forfaits.
OriginalL'auteur user207421
Si votre enfant a de la classe et de la classe Parent dans le même package que vous pouvez accéder à cet objet directement [Si vous le souhaitez], Sinon, vous avez deux options.
1 - Créer une méthode de lecture en classe Parent et d'accéder à votre champ protégé à l'aide de la méthode
2 - à l'Intérieur de la classe enfant de récupérer le Parent champ protégé à l'aide de la réflexion étant donné ci-dessous
OriginalL'auteur Naveen Ramawat
Même si la question est vieille , je suis en train d'essayer de mon mieux pour expliquer , car c'est assez commun de question pour java débutants.
Considérer la classe dans le package p1.
Gestionnaire s'étend de l'Employé et est dans un package différent.
Enterprenur classe étend Manager et est dans le paquet p3.
Maintenant dans le package racine , nous avons cette classe de test.
anEntrepreuerRef.hireDay
Wow , je me suis trompé .. Ne vous attendez pas que cela fonctionne , mais il fonctionne. Je m'attendais à
anEntrepreuerRef.hireDay
être accessibles qu'à l'intérieur de paquet p3. J'ai cependant n'a toujours pas obtenir votre point de vue sur pourquoi cela fonctionne.Vous pouvez lire les JLS j'ai cité et ma réponse encore une fois. Cela fonctionne parce que c'est un champ protégé (déclarée dans la super-classe d'une autre paquet), et de l'accès aux thru référence avec le type (ou d'une sous-classe de) lui-même.
Et, je pense que vous avez aussi une confusion de l'accessibilité de la commune de Java débutants: Dans votre exemple, vous avez explicitement mentionné quelques-méthode
static
, pour laquelle je crois que vous y attendre, il existe quelque chose de spécial pour l'accessibilité liées àstatic
. Toutefois, en matière d'accessibilité de contrôle en Java, il ne fait pas de différence pour la statique ou de la méthode d'instance.Je me demande si le JLS prouvé à vous de l'exactitude de ma réponse (et l'inexactitude dans la vôtre)? Il sera grand si vous pouvez clarifier et retirer votre downvote originale dans ma réponse (si il est de vous), de sorte qu'il se fait de nouveaux arrivants, plus facile à suivre. Merci
OriginalL'auteur Rpant