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
? И почему так?
Или это связано с тем, что конструктор не наследуется подклассами? Но я не могу понять, почему это так ...
Заранее благодарим за то, что нашли время прочитать и ответить: -]