Eclipse показывает ошибку при попытке использовать защищенный конструктор в подклассе, расположенном в другом пакете [duplicate]

На этот вопрос уже есть ответ:

Понимание защищенного модификатора Java 6 ответов

Привет, сообщество Stackoverflow: -]

Я новый участник, и сначала я хотел бы поблагодарить вас за очень полезные советы и исправления, которые вы предоставляете. Прошу прощения за то, что я французский, если мой английский не идеален.

Вот мой вопрос: я сейчас изучаю язык программирования Java, и я хотел протестировать некоторые вещи наследования. Если я правильно понял, поле объявлено какprotected могут быть доступны для классов, которые находятся в том же пакете, что и класс, в котором объявлено защищенное поле, и для всех его подклассов, независимо от того, находятся они в одном пакете или нет.

Итак, я провела эти 4 занятия, чтобы проверить это. У меня есть пакет с именем «package1», содержащий классы A и C. У меня также есть второй пакет с именем «package 2», содержащий классы A2 и C, где A2 расширяет A. Два класса C имеют абсолютно одинаковый код, только пакет, в котором в них расположены изменения. Они не распространяются на

В классе я объявил некоторые члены с различными свойствами доступа, особенно конструктор, который объявлен сprotected видимость Вот код четырех классов.

package1, класс 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

    }

}

пакет 1, класс 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, класс A2 (расширяет 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, класс 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);

    }

}

Для класса C в package2, кодA obj = new A(); выдает ошибку, но это не относится к классу C в package1. Это правильно, потому что конструктор объявлен какprotected и C в package2 не являются подклассом A, в то время как C находится в package1. К этому моменту я понимаю.

Где у меня проблема с кодомA obj = new A(); в классе А2: везде, где написано, выдается ошибкаThe constructor A() is not visible ... Поскольку конструктор класса A объявлен какprotected, почему я не могу создать экземпляр объекта типа A в классе A2?

Когда я объявляю конструктор какpublic, отлично работает. Кроме того, если я добавлю класс A2 в package1, оставив код таким, какой он есть, он тоже будет работать. Кажется, что создание экземпляра A в подклассе A возможно только в том случае, если подкласс находится в том же пакете, если конструктор A объявлен какprotected.

Однако, как вы можете видеть, если я сначала создаю экземпляр объекта A2, а затем вызываю класс Aprotected aff () метод, там он работает и защищенное правило соблюдается.

У кого-нибудь есть объяснение этой ошибке? Когда создается экземпляр объекта суперкласса в его подклассе, всегда ли этот подкласс находится в том же пакете, что и его суперкласс, если конструктор суперкласса объявлен какprotected? И почему так?

Или это связано с тем, что конструктор не наследуется подклассами? Но я не могу понять, почему это так ...

Заранее благодарим за то, что нашли время прочитать и ответить: -]

Ответы на вопрос(2)

Ваш ответ на вопрос