what non means does java inheritance constructor package protected

java - non - Eclipse muestra un error al intentar usar el constructor protegido en una subclase ubicada en otro paquete



operation in java (2)

Esto es divertido, así que déjame intentar resumirlo. ver JLS # 6.6.1

protected puede calificar a un constructor o miembro de una clase.

"miembro" incluye campo / método (estático / instancia), clase / interfaz anidada (estática / interna)

class A { protected int f protected void m(){} protected class X{} protected interface Y{}

Primero, para acceder a un constructor / miembro protegido, la clase adjunta (por ejemplo, A ) debe estar accesible. Supongamos que es el caso, entonces -

--En el interior del paquete -

Se puede acceder a un constructor o miembro protegido desde cualquier lugar dentro del mismo paquete.

- Fuera del paquete -

Solo se puede acceder a un constructor protegido dentro de los constructores de subclases, ya sea como una llamada super() o como una instanciación de clase anónima.

Un campo / método estático protegido, clase / interfaz anidada es accesible en cualquier lugar dentro de los cuerpos de las subclases.

Un campo / método de instancia protegida es más complejo

  • la "m" protegida se define en una clase A
  • se accede a obj.m en la clase B (fuera del paquete de A)
  • El tipo de obj es C

El acceso obj.m se concede solo si B es la subclase de A, y C es la subclase de B o C es B.

super.m siempre está permitido; sin embargo, no está claro cómo JLS enmarca el problema. Parece que el acceso debe tratarse de la misma manera que this.m , por lo tanto, se permite el acceso.

Esta pregunta ya tiene una respuesta aquí:

Hola comunidad de Stackoverflow: -]

Soy un nuevo miembro y, en primer lugar, me gustaría agradecerle los útiles consejos y la corrección que proporciona. Como soy francés, por favor perdóname si mi inglés no es perfecto.

Aquí está mi pregunta: actualmente estoy aprendiendo el lenguaje de programación Java, y quería probar algunas cosas de herencia. Si entendí bien, se puede acceder a un campo declarado como protected por clases que están en el mismo paquete que la clase donde se declara el campo protegido, y por todas sus subclases, ya sea que estén en el mismo paquete o no.

Entonces, hice estas 4 clases para probar esto. Tengo un paquete llamado "paquete1" que contiene las clases A y C. También tengo un segundo paquete llamado "paquete 2" que contiene las clases A2 y C, donde A2 se extiende A. Las dos clases C tienen exactamente el mismo código, solo el paquete donde se encuentran cambios. No extienden A.

En una clase, he declarado algunos miembros con diferentes propiedades de acceso, especialmente el constructor que se declara con visibilidad protected . Aquí está el código de las cuatro clases.

paquete1, clase A:

package package1; public class A { public int a; protected int b; private int c; int d; protected static int h = 30; protected void aff(){ System.out.println(h); } protected A(){ a = 1; b = 2; c = 3; d = 4; } public static void main(String[] args) { // TODO Auto-generated method stub } }

paquete 1, clase C:

package package1; public class C { public C(){ super(); } public void app(){ A obj = new A(); //////// OK } public static void main(String[] args) { // TODO Auto-generated method stub A obj = new A(); //////// OK obj.aff(); //////// OK System.out.println(obj.a); } }

paquete2, clase A2 (extiende A):

package package2; import package1.A; public class A2 extends A{ public int x; A2(){ super(); } public void app(){ A obj = new A(); //////// ERROR } public static void main(String[] args) { // TODO Auto-generated method stub A obj = new A(); //////// ERROR A2 obj2 = new A2(); obj2.aff(); //////// OK } }

paquete2, clase C:

package package2; import package1.A; public class C { public C(){ super(); } public void app(){ A obj = new A(); //////// ERROR } public static void main(String[] args) { // TODO Auto-generated method stub A obj = new A(); //////// ERROR obj.aff(); //////// ERROR System.out.println(obj.a); } }

Para la clase C en el paquete2, el código A obj = new A(); arroja un error, pero no es el caso para la clase C en el paquete1. Eso es correcto porque el constructor se declara como protected y C en el paquete 2 no es una subclase de A, mientras que C está en el paquete1. Hasta ese punto, lo entiendo.

Donde tengo un problema es con el código A obj = new A(); en la clase A2: donde sea que esté escrito, arroja un error. The constructor A() is not visible ... Como el constructor de clase A está declarado como protected , ¿por qué no podría crear una instancia de un objeto de tipo A en la clase A2?

Cuando declaro A constructor como public , funciona bien. Además, si pongo la clase A2 en el paquete 1 dejando el código tal como está, también funciona. Parece que la instancia de un objeto A en una subclase de A solo es posible si la subclase está ubicada en el mismo paquete si el constructor A está declarado como protected .

Sin embargo, como puede ver, si primero instancia un objeto A2 y luego llama al método aff () protected clase A, allí funciona y se respeta la regla protegida.

¿Alguien tiene la explicación para este error? Cuando crea una instancia de un objeto de superclase en su subclase, ¿esta subclase siempre se ubica en el mismo paquete que su superclase, si el constructor de la superclase se declara como protected ? ¿Y por qué es así?

¿O tiene esto que ver con el hecho de que un constructor no es heredado por subclases? Pero no puedo entender por qué si es el caso ...

Muchas gracias de antemano por tomarse el tiempo para leer y responder: -]


Ver Especificación del lenguaje Java :

Se puede acceder a un miembro o constructor protegido de un objeto desde fuera del paquete en el que se lo declara solo por código que es responsable de la implementación de ese objeto.

Su clase A2 no es responsable de la implementación de A en la new A() llamada new A() .

Es decir, no es responsable de la implementación de una instancia de A , pero es responsable de la implementación de una instancia de A2 .