Me gustaría saber qué está sucediendo en el siguiente ejemplo (donde se accede a un miembro protegido desde fuera del paquete a través de una subclase).Java: acceso protegido en los paquetes
Sé para las clases fuera del paquete, la subclase puede ver el miembro protegido solo a través de la herencia.
Hay dos paquetes: package1
y 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 } }
Se entiende que el método de boo()
en ExtendsprotectedClass
puede acceder foo()
, ya que los miembros protegidos se puede acceder a través de la herencia solamente.
Mi pregunta es, ¿por qué es el método foo()
trabajando muy bien cuando se accede a través de una referencia en el método de ExtendsprotectedClass
pero main()
no funcionará cuando se accede a través de la referencia epc
en UsesExtendedClass
?
@Jon Gracias. Entiendo que los miembros de la clase de la subclase pueden acceder a los miembros protegidos (como se indica en el método 'boo()'). Pero ¿Tenía curiosidad por saber por qué se le permite acceder al miembro protegido a través de una referencia de la subclase, ** SOLO ** en los métodos de las subclases? cualquier razonamiento detrás de esto? – JWhiz
@JWhiz: Editando ... –
2) Funciona porque se accede al método protegido mediante un puntero de su propia clase. Esto debería fallar:
public static void ExtendsprotectedClass.main (String [] args) { ProtectedClass epc = new ExtendsprotectedClass(); // upcast
epc.foo(); // debería ser un error de compilación?
} –