Polimorfismo serve apenas para métodos?

7 respostas
T

Estava fazendo a seguinte questão e percebi que o polimorfismo não se aplica aos campos de uma classe. Veja:

class A
{
	String name = "A";
	String getName(){
		return name;
	}
	String greeting(){
		return "class A";
	}
}

class B extends A
{
	String name = "B";
	String greeting(){
		return "class B";
	}
}

public class Client
{
	public static void main(String[] args){
		A a = new A();
		A b = new B();

		System.out.println(a.greeting() + " has name " + a.getName() );
		System.out.println(b.greeting() + " has name " + b.getName() );
	}
}

A saída é:

class A has name A
class B has name A

Pelo último valor, temos que a variável utilizada pela variável b é a da classe A e não a da classe B. Ou seja, não teve "polimorfismo de campos" (nem sei se isso existe, por este exemplo, acho que não). A minha pergunta é: polimorfismo apenas serve para chamar métodos sobreescritos?

7 Respostas

M

Não é exatamente o que você está pensando que ocorre.

Vamos analisar passo a passo a última linha:

Ele vai procurar greeting() em b e vai achar. Logo retorna “class B” e vai para a próxima concatenação.
Concatena “has name” e vai concatenar o próximo.
Agora ele vai procurar getName em um b. b é uma instância da classe B. B não tem o método getName. Próxima parada: classe A.
a classe A tem o método getName. Ele executar return name. O que ele retorna aqui? “A”.

Mas porque não retorna “B”? Lembre-se que ele está na classe A, logo vai chamar o name que ele tem acesso.
Uma classe pai não conhece o que existe na classe filha, apenas o contrário ocorre. Não teria como A saber da existência de name em B.

T

Humm, perfeito! :smiley: Entendi o que ocorre agora!

Mas, com relação a minha pergunta sobre polimorfismo, fora essa questão dele procurar a implementação do método sobreescrito nas classes filhas, tem alguma outra utilidade?

M

Uma explicação melhor sobre polimorfismo:

http://www.dsc.ufcg.edu.br/~jacques/cursos/p2/html/oo/o_que_e_polimorfismo.htm

palilo

Essa sua dúvida ficou igual as questoes “pegadinhas” que tem na prova…

Se o cara não prestar atenção nos detalhes passa batido mesmo…

ViniGodoy

Fique atento também para o seguinte. Só existe polimorfismo em métodos não em atributos.

No seu exemplo, você tem dois atributos chamados name: A.name e B.name.
Por isso, aquele “polirmorfismo” de name que deveria ocorrer em b, não ocorre.

Isso se chama shadowing. O Java permite que b tenha um atributo com o mesmo nome de a, e esse irá esconder o de a. E, obviamente, é considerado uma péssima prática de programação.

A prova de certificação frequentemente pergunta sobre shadowing, fique atento.

T

ViniGodoy:
Fique atento também para o seguinte. Só existe polimorfismo em métodos não em atributos.

No seu exemplo, você tem dois atributos chamados name: A.name e B.name.
Por isso, aquele “polirmorfismo” de name que deveria ocorrer em b, não ocorre.

Isso se chama shadowing. O Java permite que b tenha um atributo com o mesmo nome de a, e esse irá esconder o de a. E, obviamente, é considerado uma péssima prática de programação.

A prova de certificação frequentemente pergunta sobre shadowing, fique atento.

Ótimo ViniGodoy! Era exatamente isso que eu queria saber!!! Queria saber se só existia polimorfismo em métodos mesmo. Perfeito :thumbup:

V

só complementando que o polimorfismo só serve para métodos não-estáticos

Criado 15 de janeiro de 2010
Ultima resposta 16 de jan. de 2010
Respostas 7
Participantes 5