Eclipse zeigt einen Fehler an, wenn versucht wird, den geschützten Konstruktor in einer Unterklasse zu verwenden, die sich in einem anderen Paket befinde

Diese Frage hat hier bereits eine Antwort:

Verstehen von Javas geschütztem Modifikator 6 answers

Hallo Stackoverflow-Community: -]

Ich bin ein neues Mitglied und möchte mich zunächst bei Ihnen für die sehr hilfreichen Ratschläge und Korrekturen bedanken, die Sie zur Verfügung stellen. Da ich Franzose bin, verzeihen Sie mir bitte, wenn mein Englisch nicht perfekt ist.

Hier ist meine Frage: Ich lerne gerade Java-Programmiersprache und wollte ein paar Vererbungs-Sachen testen. Wenn ich richtig verstanden habe, wird ein Feld als @ deklarieprotecteduf @ kann von Klassen zugegriffen werden, die sich in demselben Paket befinden wie die Klasse, in der das geschützte Feld deklariert ist, und von allen Unterklassen, unabhängig davon, ob sie sich in demselben Paket befinden oder nicht.

Also, ich habe diese 4 Klassen gemacht, um das zu testen. Ich habe ein Paket mit dem Namen "package1", das die Klassen A und C enthält. Ich habe auch ein zweites Paket mit dem Namen "package 2", das die Klassen A2 und C enthält, wobei A2 A erweitert. Die beiden C-Klassen haben genau den gleichen Code, nur das Paket, in dem sie befinden sich Änderungen. Sie verlängern nicht A.

n einer Klasse habe ich einige Member mit unterschiedlichen Zugriffseigenschaften deklariert, insbesondere den Konstruktor, der mit @ deklariert isprotected Sichtbarkeit. Hier ist der Code der vier Klassen.

package1, class 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

    }

}

Paket 1, Klasse 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, class A2 (erweitert 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, Klasse 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);

    }

}

Für die C-Klasse in package2 ist der CodeA obj = new A(); gibt einen Fehler aus, aber für die C-Klasse in package1 ist dies nicht der Fall. Das ist richtig, weil der Konstruktor als @ deklariert iprotected und C in package2 sind keine Unterklassen von A, während C in package1 ist. Bis zu diesem Punkt verstehe ich.

Wo ich ein Problem habe ist mit dem CodeA obj = new A(); in Klasse A2: Wo immer geschrieben wird, wird ein Fehler ausgegebenThe constructor A() is not visible ... Als Klasse A Konstruktor wird als @ deklarieprotected, warum konnte ich in der Klasse A2 kein Objekt vom Typ A instanziieren?

Wenn ich einen Konstruktor als @ deklariepublic, es funktioniert gut. Außerdem funktioniert es auch, wenn ich die A2-Klasse in package1 setze, indem ich Code so lasse, wie er ist. Es scheint, dass das Instanziieren eines Objekts in einer Unterklasse von A nur möglich ist, wenn sich die Unterklasse im selben Paket befindet, wenn ein Konstruktor als @ deklariert isprotected.

Sie sehen jedoch, ob ich zuerst ein A2-Objekt instanziiere und dann die Klasse A @ aufrufprotected aff () -Methode, dort funktioniert es und die geschützte Regel wird eingehalten.

Hat jemand die Erklärung für diesen Fehler? Befindet sich diese Unterklasse beim Instanziieren eines Objekts der Oberklasse in ihrer Unterklasse immer im selben Paket wie ihre Oberklasse, wenn der Konstruktor der Oberklasse als @ deklariert isprotected? Und warum ist das so?

Oder hat das damit zu tun, dass ein Konstruktor nicht von Unterklassen geerbt wird? Aber ich kann nicht herausfinden, warum, wenn es der Fall ist ...

ielen Dank im Voraus, dass Sie sich Zeit zum Lesen und Beantworten nehmen: -]

Antworten auf die Frage(4)

Ihre Antwort auf die Frage