Eclipse muestra un error al intentar usar un constructor protegido en una subclase ubicada en otro paquete [duplicado]

Esta pregunta ya tiene una respuesta aquí:

Entender el modificador protegido de Java 6 respuestas

Hello Stackoverflow community: -]

Soy un miembro nuevo y, en primer lugar, me gustaría agradecerle por los consejos y correcciones que me han brindado. Como soy francés, perdóname si mi inglés no es perfecto.

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

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 son cambios localizados. No extienden A.

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

package1, 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);

    }

}

package2, clase A2 (se 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



    }

}

package2, 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 package2, el códigoA obj = new A(); arroja un error, pero no es el caso de la clase C en el paquete 1. Eso es correcto porque el constructor se declara comoprotected y C en package2 no es una subclase de A, mientras que C está en package1. Hasta ese punto, entiendo.

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

Cuando declaro un constructor comopublic, funciona bien. Además, si pongo la clase A2 en el paquete 1 dejando el código como está, también funciona. Parece que crear instancias de un objeto en una subclase de A solo es posible si la subclase se encuentra en el mismo paquete si un constructor se declara comoprotected.

in embargo, como puede ver, si primero instancia un objeto A2 y luego llamo a la clase Aprotected aff (), allí funciona y se respeta la regla protegida.

¿Alguien tiene la explicación de este error? Al crear instancias 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 comoprotected? ¿Y por qué es el caso si es así?

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

Gracias de antemano por tomarse el tiempo de leer y responder: -]

Respuestas a la pregunta(2)

Su respuesta a la pregunta