J'ai créé une instance de classe de base en classe dérivée et essayé d'accéder aux membres protégés.
Je peux accéder directement aux membres protégés dans une classe dérivée sans instantiquer la classe de base. p>
classe de base: p> une classe dérivée dans le même paquet - p> A dérivé classe dans un autre paquet - p> comment il est possible d'accéder à un élément protégé d'une classe de base dans une classe dérivée à l'aide d'une instance de classe de base lorsque la classe dérivée est également dans la même classe. paquet mais pas lorsque la classe dérivée est dans un package différent? p> Si je marque un membre protégé comme "statique", je suis en mesure d'accéder à un membre protégé de la classe de base à l'aide d'une instance de classe de base dans une classe dérivée qui réside dans une classe dérivée qui réside un paquet différent. p> p>
6 Réponses :
Vous avez raison que vous ne pouvez pas faire cela. La raison pour laquelle vous ne pouvez pas accéder au champ, est que vous n'êtes pas dans le même forfait que la classe, Le dernier point est la critique - si vous avez écrit p> alors cela fonctionnerait, car vous modifiez un membre protégé de votre propre catégorie em> qui est présent dans cette classe par héritage). Toutefois, dans votre cas, vous essayez de changer un membre protégé d'une classe
Cette explication est vraiment facile à comprendre. J'ai examiné la spécification de la langue de Java et leur élaboration se passa sur ma tête !!!
@Tarun - Si une réponse a fonctionné pour vous, marquez-la comme acceptée (tique ci-dessous du compteur de vote)
Je ne connaissais pas cette fonctionnalité. Je le marquerais comme répondu maintenant.
@Doyle Je pense que cette réponse a du sens, mais vous pourriez ignorer que nous pouvons accéder à MC.Ing si nous faisons de l'ing statique en mycollection
Selon la règle d'accessibilité des membres de Java, vous ne pouvez pas accéder à un membre protégé d'une classe sans l'externer.
Vous pouvez essayer ce qui suit. P>
package secondary; import com.core.MyCollection; public class MyCollection2 extends MyCollection{ public void test(){ intg = 1; } }
the Tutoriel Java dit: p>
Le modificateur protégé spécifie que le membre ne peut être consulté que dans son propre package (comme avec le package-privé) et, en outre, par une sous-classe de sa classe dans un autre paquet. p> blockQuote>
et dans votre cas, vous accédez à la variable dans un autre objet. Par coïncidence, il a une classe qui est la même que celle actuelle, mais les contrôles de visibilité ne vérifient pas cela. p>
Donc, la deuxième fois que vous êtes refusé l'accès, car vous êtes dans un autre package, et la première fois que vous recevez un accès car vous êtes dans le même paquet (et non parce que c'est une sous-classe) P>
«Première fois que vous recevez un accès parce que vous êtes dans le même paquet (et non parce que c'est une sous-classe)" Cela vous permet de préciser. Merci.
En bref, ce n'est pas vraiment possible. On dirait que vous devriez reconsidérer votre conception.
Cependant, il y a un travail autour, si vous êtes sûr que c'est ce que vous voulez faire. Vous pouvez ajouter une méthode protégée em> à mycollection code> qui prend une instance et définit la valeur de
intG code> en votre nom: p>
package secondary;
import com.core.MyCollection;
public class MyCollection2 extends MyCollection{
public void test(){
MyCollection mc = new MyCollection();
setIntg(mc, 1);
}
}
Je comprends ton point de vue. Un moyen le plus facile pour moi aurait été d'accéder directement au membre protégé que d'instantifier la classe de base et d'y accéder dans un autre package. Je l'ai fait "à tort" en jouant avec Java (je n'ai pas dit que j'avais été un testeur de Manaul :-)) Et alors aucun de mon membre de développement n'a pu me fournir une réponse concevable. Alors je l'ai posté ici.
Vous ne pouvez pas accéder à une variable protégée dans une classe dérivée (qui est dans un package différent) si accédait à l'aide d'un nouvel objet de classe mycollection.
Vous pouvez simplement écrire Intg = 1; directement sans faire (nouveau mycollection)
comme ceci:
Si un membre de classe est i. Même paquet: Voir le tableau ci-dessous pour tous les cas d'utilisation: P>
Source: Livre SCJP. P> protégé code>, il y a 2 cas: p>
- peut accéder par héritage de
- peut accéder en créant une instance de classe parent de
II. Différent paquet:
- Peut p>
Dupliqué possible de Accès protégé Java ne fonctionne pas --- En fait, c'est le mauvais DUPE! Pardon! C'est définitivement une dupe cependant.
Ne vous inquiétez pas, votre IDE ne fera aucune différence pour la question car il s'agit de la sémantique de la langue Java elle-même.
duplicaté possible de Pourquoi peut-il " T I Accéder à la méthode Java protégée, même pensé que j'ai prolongé la classe?