Estava fazendo a seguinte questão e percebi que o polimorfismo não se aplica aos campos de uma classe. Veja:
classA{Stringname="A";StringgetName(){returnname;}Stringgreeting(){return"class A";}}classBextendsA{Stringname="B";Stringgreeting(){return"class B";}}publicclassClient{publicstaticvoidmain(String[]args){Aa=newA();Ab=newB();System.out.println(a.greeting()+" has name "+a.getName());System.out.println(b.greeting()+" has name "+b.getName());}}
A saída é:
classAhasnameAclassBhasnameA
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?
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
TiagoTC
Humm, perfeito! 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?
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
TiagoTC
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
vmsb11
só complementando que o polimorfismo só serve para métodos não-estáticos…