Subclasse não consegue acessar método da superclasse
36 respostas
S
sula.fenix
Eu tenho a classe QuadradoDiferente que é subclasse da classe Quadrado e elas estão em pacotes diferentes.
Na classe Quadrado eu tenho um método que está com o modificador “protected”.
Ao tentar acessar esse método da QuadradoDiferente, a compilação falha.
Alguém poderia me explicar porque isso acontece? Já que QuadradoDiferente é subclasse de Quadrado.
Gostaria de saber porque isso acontece e o que poderia fazer para contornar isso.
S
sula.fenix
A classe está como public.
E o método que quero acessar está como protected.
Alsberg
O modificador protected permite que você acesse de uma subclasse e/ou de uma classe do mesmo pacote.
PORÉM…
se você está em outro pacote, e o método é protected, você pode acessar o método protected SOMENTE ATRAVÉS DE HERANÇA, e não instanciando um objeto da classe
então ao invés de x.metodo();
faça super.metodo();
rogelgarcia
Então… o problema é o que mencionei mesmo… Você só pode acessar o método protected da própria instancia.
Para acessar outra instancia, deveria ser public a visibilidade.
Alsberg
na verdade se você nao sobrecarregou o metodo, nem precisa do super.metodo(). faça apenas metodo();
o super.metodo() seria somente em caso de voce ter sobrecarregado seu metodo na subclasse mas quisesse acessar a versao dele da superclasse
G
GilsonNunes
rogelgarcia:
Então… o problema é o que mencionei mesmo… Você só pode acessar o método protected da própria instancia.
Para acessar outra instancia, deveria ser public a visibilidade.
acho q os dois estão equivocados!
nel
Não se pode acessar um método com o modificador de acesso protected de um pacote diferente da super classe, mesmo que a classe que executa o acesso ao método seja filha, simples assim. Se quer que o método seja acessível a qualquer um, ele deve ser modificado para public, senão terá esse “limitador”.
Abraços.
G
GilsonNunes
mude:
Quadrado quad = new Quadrado(1, 1, 1);
para
QuadradoDiferente quad = new QuadradoDiferente(1, 1, 1);
G
GilsonNunes
nel:
Não se pode acessar um método com o modificador de acesso protected de um pacote diferente da super classe, mesmo que a classe que executa o acesso ao método seja filha, simples assim. Se quer que o método seja acessível a qualquer um, ele deve ser modificado para public, senão terá esse "limitador".
importPack1.Quadrado;publicclassQuadradoDiferenteextendsQuadrado{publicQuadradoDiferente(inta,intb,intc){super(a,b,c);// TODO Auto-generated constructor stub}publicstaticvoidmain(Stringargs[]){QuadradoDiferentequad=newQuadradoDiferente(1,1,1);quad.mostra();// protected void mostra(). lembra? }}
nel
Altere o pacote de Pack1 para pack2 e veja se funciona. Querendo ou não, é o mesmo pacote, talvez eu tenha me expressado mal.
Tem de pertencer ao pacote em si, se começa com pack1, tem que ou estar ali ou para a frente, se for anterior ou diferente disso, não funciona.
G
GilsonNunes
nel:
Altere o pacote de Pack1 para pack2 e veja se funciona. Querendo ou não, é o mesmo pacote, talvez eu tenha me expressado mal.
Tem de pertencer ao pacote em si, se começa com pack1, tem que ou estar ali ou para a frente, se for anterior ou diferente disso, não funciona.
packagePack2;importPack1.Quadrado;publicclassQuadradoDiferenteextendsQuadrado{publicQuadradoDiferente(inta,intb,intc){super(a,b,c);// TODO Auto-generated constructor stub}publicstaticvoidmain(Stringargs[]){QuadradoDiferentequad=newQuadradoDiferente(1,1,1);quad.mostra();}}
melhor q conjecturar, é testar.
turim
Ao utiliza o modificador de acsso protected seus métodos somente são acessíveis por subclasses (mesmo sendo de outro pacote), ou classes do mesmo pacote.
Se você somente herdar, também não conseguirá acessar o método a partir de outro pacote, a não ser que subscreva o método e altere seu nível de acesso para public, o Java permite isso.
Você pode modificar o nível de acesso para mais visível.
No seu caso, se o método mostra é protected você nunca irá conseguir acessá-lo em outro pacote.
publique as classes inteiras (incluindo os imports, claro) e poderemos ver onde é o erro exatamente
nel
Vou me redimir e corrigir algo muito importante. O método modificador protected aceita o acesso desde que o mesmo seja realizado a partir de uma classe filha, independente de pacote/projeto. O mesmo só é válido para o modificador default/friendly.
Foi um equívoco de minha parte. Responder as pressas faz com que falemos bobagem. Mas GilsonNunes, o ideal é simplesmente corrigir um erro de um colega do fórum, responder a dúvida de quem participou e não simplesmente provarmos teorias, essa pode ser facilmente tirada lendo a especificação Java, é claro. De qualquer forma, fico grato pela observação.
Ao utiliza o modificador de acsso protected seus métodos somente são acessíveis por subclasses (mesmo sendo de outro pacote), ou classes do mesmo pacote.
Se você somente herdar, também não conseguirá acessar o método a partir de outro pacote, a não ser que subscreva o método e altere seu nível de acesso para public, o Java permite isso.
Você pode modificar o nível de acesso para mais visível.
No seu caso, se o método mostra é protected você nunca irá conseguir acessá-lo em outro pacote.
sula.fenix, se fez toda a declaração corretamente, criando uma instancia da classe filha você poderá acessar normalmente o método pai, independente de pacote/projeto em que a classe filha esteja alocada (obviamente, fique atenta ao(s) import(s)).
Abraços.
turim
Só acrescentando, se você somente herdar a classe, uma instância da classe filha não conseguirá acessar o método protected herdado a partir de um pacote diferente.
A não ser que subscreva e tranforme ele em public.
G
GilsonNunes
turim:
GilsonNunes
Sim, como o nel, disse é parte da especificação.
e não rodou não?
olha a tabela do link q vc postou.
Access Levels
Modifier____Class Package Subclass World
public_______Y____Y________Y_____Y
protected____Y____Y________Y_____N
no modifier__ Y____Y________N_____N
private______Y____N________N_____N
Mas eu fiz o teste aqui e acessou, pelo fato de que a subclasse acessa os membros com modificador protected da super classe atravéz de herança , independente se é o mesmo pacote ou não.
viniciusalvess
turim:
Só acrescentando, se você somente herdar a classe, uma instância da classe filha não conseguirá acessar o método protected herdado a partir de um pacote diferente.
A não ser que subscreva e tranforme ele em public.
protected consegue sim , o default não consegue em pacote diferente , teste o código que postei acima.
turim
Eu quiz dizer a nível de instância.
Se você criar uma instância da classe filha em outro pacote, não conseguirá acessar o método protected.
Como foi o caso da pessoa que criou esse tópico.
isso quad.mostra();, ela não irá conseguir fazer.
viniciusalvess
turim:
Eu quiz dizer a nível de instância.
Se você criar uma instância da classe filha em outro pacote, não conseguirá acessar o método protected.
Claro , nesse caso o modificador de acesso deveria ser public.
G
GilsonNunes
turim:
Eu quiz dizer a nível de instância.
Se você criar uma instância da classe filha em outro pacote, não conseguirá acessar o método protected.
Como foi o caso da pessoa que criou esse tópico.
isso quad.mostra();, ela não irá conseguir fazer.
o q vc quiz dizer com herdar aki então?
nel
turim:
Eu quiz dizer a nível de instância.
Se você criar uma instância da classe filha em outro pacote, não conseguirá acessar o método protected.
Como foi o caso da pessoa que criou esse tópico.
isso quad.mostra();, ela não irá conseguir fazer.
Consegue cara…é isso que estamos tentando dizer. Olha o código que o GilsonNunes postou.
O protected em comparação ao public possui uma diferença bem básica, a obrigatoriedade de que a classe que estará acessando o método (que é o caso em questão) protected seja uma classe filha, simples assim. Enquanto no public, não há necessidade de relação de herança.
turim
viniciusalvess:
turim:
Eu quiz dizer a nível de instância.
Se você criar uma instância da classe filha em outro pacote, não conseguirá acessar o método protected.
Claro , nesse caso o modificador de acesso deveria ser public.
Então, talvez eu não tenho sido claro, mas essa era a dúvida inicial, creio eu.
Teria um erro de compilação. Como o caso da sula.fenix.
nel
Não cara, não dá erro de compilação.
viniciusalvess
Dará erro sim , o post anterior do Turin.
Nesse caso o Turin está correto ! O que não é o caso inicial do tópico.
S
sula.fenix
Obrigada galera.
Acho que entendi.
S
sula.fenix
Nossa, não pensei que essa minha dúvida fosse gerar tantos comentários.
Mas vamos lá.
Eu não preciso fazer com que o código funcione, eu preciso explicar porque não funciona.
A pergunta do exercício é: Se QuadradoDiferente é subclasse de Quadrado, por que a compilação falha?
packagegeometria.borda;importgeometria.*;publicclassQuadradoDiferenteextendsQuadrado{publicvoidmostra(){System.out.println("A área é: ");super.mostra();}publicstaticvoidmain(Stringargs[]){Quadradoquad=newQuadrado(1,1,1);quad.mostra();}}
Como o método mostra() na classe Quadrado está como protected, no main da QuadradoDiferente, ocorre erro na linha: quad.mostra();
nel
Dará erro sim , o post anterior do Turin.
Nesse caso o Turin está correto ! O que não é o caso inicial do tópico.
Dá erro porque está tentando acessar um método protected com a instância da própria classe Pai, só não havia ficado claro no código isso pra mim.
É o mesmo caso da sula.fenix, que instancia a própria classe Pai. Se fosse a instancia da classe filho, funcionaria perfeitamente.
S
sula.fenix
Graças às respostas de vocês eu mandei a seguinte resposta para o meu exercício:
Como a classe está em outro pacote, e o método na classe Circulo é protected, só é possível acessar esse método através de herança, e não instanciando um objeto da classe.