Subclasse não consegue acessar método da superclasse

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.

Grata,

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
     }
}

Seria isso?

A classe Quadrado está com o modificador public?

[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
     }
}

Seria isso?[/quote]

Seria quase isso.

Na classe Quadrado eu tenho o método:

protected void mostra() {
		System.out.println("Imprime algo");
	}

Já na QuadradoDiferente eu tenho o método:

public void mosta() {
		System.out.println("A área é: ");
		super.mostra();
	}

Ou seja, nesse pedaço eu já faço que vc falou, certo?

Mas o problema na verdade está aqui:

public static void main(String args[]) {
		Quadrado quad = new Quadrado(1, 1, 1);
		quad.mostra();
	}

é no quad.mostra(); que tenho o erro.

Gostaria de saber porque isso acontece e o que poderia fazer para contornar isso.

A classe está como public.

E o método que quero acessar está como protected.

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();

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.

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

[quote=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.[/quote]

acho q os dois estão equivocados!

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.

mude:
Quadrado quad = new Quadrado(1, 1, 1);

para

QuadradoDiferente quad = new QuadradoDiferente(1, 1, 1);

[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
}

public static void main(String args[]) {
QuadradoDiferente quad = new QuadradoDiferente(1, 1, 1);
quad.mostra(); // protected void mostra(). lembra?
}
}

[/code]

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();  
} 	

}
[/code]

melhor q conjecturar, é testar.

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.

Aqui tem um artigo legal sobre isso.

Valeu.

publique as classes inteiras (incluindo os imports, claro) e poderemos ver onde é o erro exatamente

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.

sula.fenix, pode ler aqui se quiser: http://docs.oracle.com/javase/specs/

Abraços a todos.

[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.

Aqui tem um artigo legal sobre isso.

Valeu.[/quote]

vc testou esse exemplo ai?

pô pessoal! é só testar.

GilsonNunes

Sim, como o nel, disse é parte da especificação.

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.