Je voudrais comprendre ce qui se passe dans l'exemple ci-dessous (où un membre protégé est accédé depuis l'extérieur du paquet à travers une sous-classe).Java: accès protégé entre paquets
Je sais que pour les classes en dehors du package, la sous-classe ne peut voir le membre protégé que par héritage. Il y a deux paquets: 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 méthode boo()
dans ExtendsprotectedClass
peut accéder à foo()
, puisque les membres protégés sont accessibles par héritage uniquement.
Ma question est, pourquoi l'amende lorsque l'on travaille la méthode foo()
accessible par une référence dans la méthode main()
de ExtendsprotectedClass
mais ne fonctionnera pas quand on y accède par la référence à epc
UsesExtendedClass
?
@Jon Merci. Je comprends que les membres de classe de la sous-classe peuvent accéder aux membres protégés (comme indiqué dans la méthode 'boo()'). Mais Était curieux de savoir pourquoi il est permis d'accéder au membre protégé via une référence de la sous-classe, ** SEULEMENT ** dans les méthodes de sous-classe? aucune raison derrière cela? – JWhiz
@JWhiz: Modification ... –
2) Fonctionne parce que la méthode protégée est accessible par un pointeur de sa propre classe. Cela doit échouer:
public static void ExtendsprotectedClass.main (String [] args) { ProtectedClass epc = new ExtendsprotectedClass(); // upcast
epc.foo(); // devrait être une erreur de compilation?
} –