Java: protégé l'accès à l'ensemble des packages
J'aimerais comprendre ce qui se passe dans l'exemple ci-dessous (où un membre protégé est accessible à partir de l'extérieur du colis par le biais d'une sous-classe).
Je sais que pour les cours à l'extérieur de l'emballage, de la sous-classe peut voir les membres protégés seulement par héritage.
Il y a deux packages: package1
et package2
.
package1
:ProtectedClass.java
package org.test.package1; public class ProtectedClass { protected void foo () { System.out.println("foo"); } }
package2
:ExtendsprotectedClass.java
package org.test.package2; import org.test.package1.ProtectedClass; public class ExtendsprotectedClass extends ProtectedClass { public void boo() { foo(); //This works, //since protected method is visible through inheritance } public static void main(String[] args) { ExtendsprotectedClass epc = new ExtendsprotectedClass(); epc.foo(); //Why is this working? //Since it is accessed through a reference, //foo() should not be visible, right? } }
package2
:UsesExtendedClass.java
package org.test.package2; public class UsesExtendedClass { public static void main(String[] args) { ExtendsprotectedClass epc = new ExtendsprotectedClass(); epc.foo(); //CompilationError: //The method foo() from the type ProtectedClass //is not visible } }
Il est entendu que la boo()
méthode dans ExtendsprotectedClass
pouvez accéder à foo()
, puisque les membres protégés peuvent être accessibles par le biais de l'héritage.
Ma question est, pourquoi le foo()
méthode fonctionne bien quand on y accède via une référence dans le main()
méthode de ExtendsprotectedClass
mais ne fonctionnera pas lors de l'accès par le biais de la epc
de référence dans UsesExtendedClass
?
OriginalL'auteur JWhiz | 2010-08-22
Vous devez vous connecter pour publier un commentaire.
Code à l'intérieur de la
ExtendsprotectedClass
classe est autorisé à accès protégé les membres deProtectedClass
par l'intermédiaire d'une référence de typeExtendsprotectedClass
. À partir de la JLS section 6.6.2:et
UsesExtendedClass
n'est pas responsable de la mise en œuvre deExtendsprotectedClass
, d'où l'appel échoue.EDIT: Le raisonnement derrière cela est que
protected
d'accès est conçu pour aider les sous-classes implémenter la fonctionnalité dont ils ont besoin, en donnant plus accès à la partie interne de la superclasse que ce qui serait normalement disponible. Si cela était disponible à tous code, il serait assez proche de ce qui rend la méthode public. Fondamentalement, les sous-classes sont de confiance pour ne pas casser l'encapsulation; ils ont plus de capacités à l'intérieur des objets de leur propre type. L'API publique ne devrait pas exposer ces détails, mais l'API protégé peut juste pour les fins de donner des sous-classes de plus de possibilités.boo()
méthode ). Mais il Était curieux de savoir pourquoi il est autorisé à accéder à la membre protégé par une référence de la sous-classe, UNIQUEMENT dans la sous-classe des méthodes ? toute logique derrière cela ?L'édition...
2) les Œuvres, parce que parce que la méthode protégée est accessible par un pointeur de sa propre classe. Cela devrait échouer: <br> public static void ExtendsprotectedClass.main(String[] args){ ProtectedClass epc = new ExtendsprotectedClass(); //sortie <br> de la cbe.foo(); // doit être d'erreur de compilation? <br> }
acceptez que
protected
d'accès est conçu pour aider les sous-classes implémenter la fonctionnalité dont ils ont besoin. C'est pourquoi j'avais ajouté un bout de codeboo()
appelfoo()
.j'.e sous-classe code peut utiliser les protégésfoo()
ou remplacerfoo()
de la classe de base.compris. mais ce que je ne suis pas encore arriver est pourquoi est-il autorisé à accéder directement à travers une référenceExtendsprotectedClass epc = new ExtendsprotectedClass();epc.foo();
.Il ne devrait pas eu que dans le second cas le droit?Aucune justification sur pourquoi est-il permettre à accès protégé méthodefoo()
par l'intermédiaire d'une référence seulement dans les cours de mise en œuvre de la classe de base?Parce qu'il signifie que le code à l'intérieur de cette classe est capable de travailler instances de lui-même facilement pour des choses comme la comparaison, la statique de l'usine des méthodes, etc. Il peut être une vraie douleur pour écrire une méthode d'instance, juste pour le plaisir d'être en mesure d'obtenir à un membre en particulier. Encore une fois, le code de la sous-classe doit savoir ce qu'elle fait.
OriginalL'auteur Jon Skeet
Il travaille dans le premier cas, car il est appelé à partir de la même classe, même la méthode accédez par l'intermédiaire d'une référence. Vous pouvez même appeler un
private
méthode deExtendsprotectedClass
par le biais d'un renvoi dans la même méthode.+1
. Mais , Il ne devrait pas être autorisé à appelerprivate
méthodes par l'intermédiaire d'une référence d'Objet de droit ? N'est-ce pas violer le but d'en faireprivate
? Pour quelle raison particulière permettant de le faire ?la java des modificateurs d'accès de travail à la classe, et non pas au niveau de l'instance. En raison de cela, une méthode privée est privée de la classe, et non pas une instance. Si le privé a travaillé sur les instances que vous auriez à faire plus de variables et de méthodes publiques si les deux instances ont pour interagir. Ce serait briser l'encapsulation en faisant de la mise en œuvre visible à l'extérieur de la classe.
OriginalL'auteur fastcodejava
Je crois que vous avez répondu à votre propre question; UsesExtendedClass n'hérite pas de ProtectedClass, et, par définition, -- "protégé" les membres ne sont accessibles que dans la classe dans laquelle elles sont déclarées /défini ou dans une classe qui hérite de celui dans lequel elle est déclarée ou définie.
by definition -- "protected" members are accessible only in the class in which they are declared / defined
. Je n'ai pas tout à fait d'accord que les membres protégés sont accessibles à partir d'autres classes dans le même package, sans héritage.OriginalL'auteur Michael Aaron Safyan
prendre un coup d'oeil sur cette photo de : http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
son clair que les membres protégés de la classe peut être consulté via la sous-classe.
OriginalL'auteur Maher Abuthraa