method example java visibility protected access-modifiers

java - example - protected package



Comprender el modificador protegido de Java (6)

¿Que está pasando aqui?

Has malentendido el significado de protected . Puede acceder a los miembros protegidos declarados en A desde dentro de C , pero solo para instancias de C o subclases de C Consulte la sección 6.6.2 del JLS para obtener detalles sobre el acceso protegido. En particular:

Deje que C sea la clase en la que se declara un miembro protegido. El acceso solo está permitido dentro del cuerpo de una subclase S de C.

Además, si Id denota un campo de instancia o método de instancia, entonces:

  • [...]

  • Si el acceso es por una expresión de acceso de campo E.Id, donde E es una expresión primaria, o por una expresión de invocación de método E.Id (...), Donde E es una expresión primaria, entonces el acceso está permitido si y solo si el tipo de E es S o una subclase de S.

(Énfasis mío)

Entonces este código estaría bien:

C c = new C(); System.out.println(c.publicInt); System.out.println(c.protectedInt);

Tengo una clase llamada A en el paquete1 y otra clase llamada C en el paquete2. La clase C extiende la clase A.

A tiene una variable de instancia que se declara así:

protected int protectedInt = 1;

Aquí está el código para la clase A

package package1; public class A { public int publicInt = 1; private int privateInt = 1; int defaultInt = 1; protected int protectedInt = 1; }

Y aquí está el código para la clase C:

package package2; import package1.A; public class C extends A{ public void go(){ //remember the import statement A a = new A(); System.out.println(a.publicInt); System.out.println(a.protectedInt); } }

Eclipse subraya la última línea en C.go () y dice "A.protectedInt" no está visible. Parece que esto entra en conflicto con la definición de la palabra clave "protegida", que figura en la documentación del oráculo.

El modificador protegido especifica que solo se puede acceder al miembro dentro de su propio paquete (como con package-private) y, además, mediante una subclase de su clase en otro paquete.

¿Que está pasando aqui?


Como C hereda A , C puede usar directamente la variable protected de A como abajo

public class C extends A{ public void go(){ System.out.println(protectedInt); } }

Según su código, está creando una instancia de A y está accediendo a la variable protected través de esa instancia , lo que infringe la regla de Java: una variable protegida no está visible fuera del paquete


Dentro del mismo paquete donde se declara el miembro protegido, se permite el acceso:

package package1; public class C extends A{ public void go(){ A a = new A(); System.out.println(a.protectedInt); // got printed C c = new C(); System.out.println(c.protectedInt); // got printed as well } }

Fuera del paquete donde se declara el miembro protegido, se permite el acceso si y solo si el código es responsable de la implementación de ese objeto. En este caso, C es responsable de la implementación de ese objeto, por lo que podría acceder al protegido.

package package2; public class C extends A{ public void go(){ A a = new A(); System.out.println(a.protectedInt); // compiler complains C c = new C(); System.out.println(c.protectedInt); // got printed } }


No es necesario crear una instancia de la clase de protección dentro de la clase Protection2. Puede llamar directamente a la variable protegida sin instanciar la clase de Protección. Porque la clase Protection2 amplía la clase de protección. Así que la variable se hereda automáticamente por subclase.

Pruebe con el siguiente código:

public class Protection2 extends Protection{ Protection2() {System.out.println("n_pro = " +n_pro); }}


Protegido significa:

a) Este miembro será accesible para todas las clases en el mismo paquete a través de la referencia de un objeto.

b) Para un paquete diferente, esto será accesible solo dentro de las Subclases de A decir B y la referencia utilizada puede ser de instancia B o de cualquier subclase de B.

Tomemos un ejemplo:

Deje que A sea la clase padre en algún paquete, digamos com.ex1 Deje que B, C sean clases en diferentes paquetes wrt a A, diga com.ex2 . Además, B extends A y C extends B Veremos cómo podemos usar el campo protegido de A dentro de B (una subclase de A)

Código de A:

public class A { protected int a = 10; }

Código de B:

public class B extends A { public void printUsingInheritance() { // Using this System.out.println(this.a); } public void printUsingInstantiation() { // Using instance of B B b = new B(); System.out.println(b.a); // Using instance of C as C is subclass of B C c = new C(); System.out.println(c.a); A a = new A(); System.out.println(a.a); // Compilation error as A is not subclass of B } }

C de código:

public class C extends B { }

Para Static protegido :

Se aplican las mismas reglas, excepto que en b) ahora es accesible en cualquier subclase de A a por referencia de clase de A. Reference


public void go(){ //remember the import statement A a = new A(); System.out.println(a.publicInt); System.out.println(a.protectedInt); }

Cuando estás haciendo A a = new A(); y a.protectedInt acceder al miembro protegido de A que es ilegal según los estándares de Java

En su lugar, puede hacer this.protectedInt . this.protectedInt directamente.