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.
Você pode acessar o membro herdado na própria instancia, mas não de uma instancia diferente.
Exemplo:
public class Quadrado {
protected metodo(){}
}
public class QuadradoDiferente extends Quadrado {
public metodo2(){
super.metodo(); //ok
metodo(); // ok
Quadrado x = new Quadrado();
x.metodo(); //erro
}
}
[quote=rogelgarcia]Você pode acessar o membro herdado na própria instancia, mas não de uma instancia diferente.
Exemplo:
public class Quadrado {
protected metodo(){}
}
public class QuadradoDiferente extends Quadrado {
public metodo2(){
super.metodo(); //ok
metodo(); // ok
Quadrado x = new Quadrado();
x.metodo(); //erro
}
}
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
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”.
[quote=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.[/quote]
então isso aki não funcionaria?
[code]package Pack1;
public class Quadrado {
public Quadrado(int a, int b, int c) {
}
protected void mostra() {
System.out.println("Imprime algo");
}
}
[/code]
[code]import Pack1.Quadrado;
public class QuadradoDiferente extends Quadrado {
public QuadradoDiferente(int a, int b, int c) {
super(a, b, c);
// TODO Auto-generated constructor stub
}
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.
[quote=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.[/quote]
e assim?
package Pack1;
public class Quadrado {
public Quadrado(int a, int b, int c) {
}
protected void mostra() {
System.out.println("Imprime algo");
}
}
[code]package Pack2;
import Pack1.Quadrado;
public class QuadradoDiferente extends Quadrado {
public QuadradoDiferente(int a, int b, int c) {
super(a, b, c);
// TODO Auto-generated constructor stub
}
public static void main(String args[]) {
QuadradoDiferente quad = new QuadradoDiferente(1, 1, 1);
quad.mostra();
}
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.
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.
[quote=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.
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)).