Eclipse mostra um erro ao tentar usar o construtor protegido em uma subclasse localizada em outro pacote [duplicado]
Esta pergunta já tem uma resposta aqui:
Entendendo o modificador protegido do java respostasomunidade Hello Hello Stackoverflow: -]
Sou um novo membro e, em primeiro lugar, gostaria de agradecer pelos conselhos e correções muito úteis que você fornece. Como sou francês, perdoe-me se meu inglês não for perfeit
Aqui está minha pergunta: atualmente estou aprendendo a linguagem de programação Java e queria testar algumas coisas de herança. Se eu entendi direito, um campo declarado comoprotected
pode ser acessado por classes que estão no mesmo pacote que a classe em que o campo protegido é declarado e por todas as suas subclasses, estejam elas no mesmo pacote ou nã
Então, eu fiz essas 4 classes para testar isso. Eu tenho um pacote chamado "package1" contendo as classes A e C. Eu também tenho um segundo pacote chamado "package 2" contendo as classes A2 e C, em que A2 estende A. As duas classes C têm exatamente o mesmo código, apenas o pacote em que eles estão localizados alterações. Eles não estendem A.
Em uma classe, declarei alguns membros com propriedades de acesso diferentes, especialmente o construtor que é declarado comprotected
visibilidade. Aqui está o código das quatro classes.
package1, classe 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
}
}
package 1, classe 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, classe A2 (estende 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, classe 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 classe C no pacote2, o códigoA obj = new A();
lança um erro, mas não é o caso da classe C no pacote1. Correto porque o construtor é declarado comoprotected
e C no pacote2 não são uma subclasse de A, enquanto C está no pacote1. Até esse ponto, eu entendo.
Onde eu tenho um problema é com o códigoA obj = new A();
na classe A2: onde quer que esteja escrito, gera um erroThe constructor A() is not visible
... Como a classe Um construtor é declarado comoprotected
, por que não consegui instanciar um objeto do tipo A na classe A
Quando declaro Um construtor comopublic
, Funciona bem. Além disso, se eu colocar a classe A2 no pacote1, deixando o código como está, ele também funciona. Parece que instanciar um objeto em uma subclasse de A só é possível se a subclasse estiver localizada no mesmo pacote se um construtor for declarado comoprotected
.
No entanto, como você pode ver, se eu instanciar primeiro um objeto A2 e depois chamar a classe Aprotected
aff (), lá funciona e a regra protegida é respeitad
Alguém tem a explicação para esse erro? Ao instanciar um objeto de superclasse em sua subclasse, essa subclasse sempre está localizada no mesmo pacote que sua superclasse, se o construtor da superclasse for declarado comoprotected
? E por que é esse o cas
Ou isso tem a ver com o fato de que um construtor não é herdado por subclasses? Mas não consigo descobrir por que, se for esse o caso ...
Muito obrigado por reservar um tempo para ler e responder: -]