Protégé modificateur d'accès en Java
Je vais avoir un peu de mal à comprendre les protégés modificateur d'accès en java (ou la conception). Je pensais que cela signifiait paquet et l'accès à travers des objets qui héritent de la classe contenant un résumé membre.
J'ai écrit l'exemple de code suivant. Je vois que le commentaire sur la ligne de produit une erreur de compilation si décommentée. Pourquoi ai-je accès pro par le biais d'un Second objet dans la Seconde, mais pas par l'intermédiaire d'un Premier objet de la Deuxième?
package first;
public class First {
protected void pro(){
System.out.println("Can see protected method");
}
}
package first;
public class InFirst {
public static void main(String[] args){
First fst = new First();
fst.pro();
}
}
package second;
import first.First;
public class Second extends First {
public static void main(String[] args){
First fst = new First();
// fst.pro();
Second sec = new Second();
sec.pro();
}
}
Vous pourriez prendre une lecture de Contrôle de l'Accès aux Membres d'une Classe pour plus de détails
Bonne observation. Normalement, c'est source de confusion pour beaucoup de développeurs. Voir le schéma ci-dessous, peut-être que c'est utile.
Merci, j'ai lu cela. Je suis fondamentalement confus par le membre de phrase "par une sous-classe de sa classe dans un autre package" qu'ils utilisent pour les protégés de modificateur. Comme indiqué ci-dessus, je peux accéder à des pro de la Seconde, mais seulement par l'intermédiaire d'un Deuxième objet de la sec et pas par l'intermédiaire d'un Premier objet de la fst.
Je pense que le détail important qui vous manque dans la sous-classe d'accès d'une classe parent membre protégé, c'est que l'accès doit se faire dans le cadre de la sous-classe "mise en œuvre" (les spécifications se réfère au corps, à la même différence). La méthode main de la classe est pas considéré comme faisant partie de sa mise en œuvre, qui est pourquoi vous obtenez une erreur.
Si j'écris le même ensemble d'états non méthode statique dans la Deuxième, j'obtiens toujours la même erreur si je décommentez la ligne de commentaire. Ce n'est donc pas la source de l'erreur.
Bonne observation. Normalement, c'est source de confusion pour beaucoup de développeurs. Voir le schéma ci-dessous, peut-être que c'est utile.
Merci, j'ai lu cela. Je suis fondamentalement confus par le membre de phrase "par une sous-classe de sa classe dans un autre package" qu'ils utilisent pour les protégés de modificateur. Comme indiqué ci-dessus, je peux accéder à des pro de la Seconde, mais seulement par l'intermédiaire d'un Deuxième objet de la sec et pas par l'intermédiaire d'un Premier objet de la fst.
Je pense que le détail important qui vous manque dans la sous-classe d'accès d'une classe parent membre protégé, c'est que l'accès doit se faire dans le cadre de la sous-classe "mise en œuvre" (les spécifications se réfère au corps, à la même différence). La méthode main de la classe est pas considéré comme faisant partie de sa mise en œuvre, qui est pourquoi vous obtenez une erreur.
Si j'écris le même ensemble d'états non méthode statique dans la Deuxième, j'obtiens toujours la même erreur si je décommentez la ligne de commentaire. Ce n'est donc pas la source de l'erreur.
OriginalL'auteur B M | 2013-04-11
Vous devez vous connecter pour publier un commentaire.
La page web @MadProgrammer liée donne une explication décente:
Cela signifie que le membre protégé doit être directement accessible par le biais soit la classe à laquelle il est défini dans ou une sous-classe de la classe dit, mais aussi dans le package approprié. Cela ne veut pas nécessairement dire que vous pouvez accéder à la membre protégé par une instance de la classe dit créé au sein d'une sous-classe de la classe dit. L'accent est mis sur les paquets concernés.
Voici des exemples:
Tente d'accéder membre en question à partir de quel paquet? première
Est la (sous -) classe, qui contient ledit membre, ou de sa classe parente, dont il hérite de la membre de, définie dans le même paquet? Oui,
First
est défini danspackage first
, de sorte que leprotected
membre est accessible à partir deFirst
danspackage first
.Tente d'accéder membre en question à partir de quel paquet? deuxième
Est la (sous -) classe, qui contient ledit membre, ou de sa classe parente, dont il hérite de la membre de, définie dans le même paquet? Non,
First
est défini danspackage first
, doncprotected
rend le membre inaccessible à partir deFirst
danspackage second
.Tente d'accéder membre en question à partir de quel paquet? deuxième
Est la (sous -) classe, qui contient ledit membre, ou de sa classe parente, dont il hérite de la membre de, définie dans le même paquet? Oui,
Second
, qui est définie danspackage second
, hérite de la membre deFirst
, de sorte que leprotected
membre est accessible à partir deSecond
danspackage second
.Plus d'exemples pour plus de clarté:
Tente d'accéder membre en question à partir de quel paquet? première
Est la (sous -) classe, qui contient ledit membre, ou de sa classe parente, dont il hérite de la membre de, définie dans le même paquet? Oui,
Second
hérite du membre deFirst
, qui est définie danspackage first
, de sorte que leprotected
membre est accessible à partir deSecond
danspackage first
.Tente d'accéder membre en question à partir de quel paquet? première
Est la (sous -) classe, qui contient ledit membre, ou de sa classe parente, dont il hérite de la membre de, définie dans le même paquet? Oui,
Third
hérite du membre deSecond
, qui hérite deFirst
où le membre est défini (package first
), de sorte que leprotected
membre est accessible à partir deThird
danspackage first
.OriginalL'auteur Ryan
Voici un diagramme pour montrer le niveau d'accès. Vous code appartient à la R(Référence) cas Convertible dans le diagramme. C'est, de référence dans la sous-classe dans un autre paquet n'est pas autorisé à accéder.
Voici le lien: programcreek.com/2009/02/....
OriginalL'auteur Ryan
Membre protégé en java
Même paquet-(il se comporte comme valeur par défaut)
Il est accessible dans le sameclass,ses enfants des classes et des classes enfant.(il se comporte comme valeur par défaut)
Vous pouvez même accéder à des membres protégés à l'aide de parent ou de l'enfant de référence.
Emballage extérieur-
Elle est accessible uniquement aux itz enfant de la classe et le point le plus important ici est que le produit de référence utilisé doit être de la même classe enfant
seulement
OriginalL'auteur Anand
moyen protégé visible à d'autres classes dans le même package. depuis la Seconde est dans un package différent " de la seconde.Deuxième", il ne peut pas accéder .pro() en premier.
si vous avez créé un Deuxième sous le nom de package de "première" - il serait ensuite travailler.
voir ce syborg dit ci-dessus. "sous-classes ET même package"
OriginalL'auteur timzilla