Encontrei este exercicio e fiquei na dúvida. Eu tinha certeza que a saída seria:
Beta:foo Beta:foo Beta:bar Beta:bar
mas a resposta certa é:
Alpha:foo Beta:foo Beta:bar Beta:bar
por quê?, se “a” é do tipo Alpha mas faz refencia a Beta?
Tbém boiei . De acordo com a lógica de herança a JVM procuraria o método foo de baixo para cima, ou seja, de Beta para Alpha.
O metodo foo de Beta, na verdade está sobrecarregado e não sobrescrito. Pensei que a “mágica do negócio” estaria aí, mas creio que foi só para confundir mesmo…
xandevieira
alguem pode me explicar isso? linha 13
publicvoidfoo(String...a)
se retirar os … muda a saida.
peczenyj
Vc declarou a referência a como Alpha, e Alpha não tem um método com essa assinatura:
public void foo(String a)
mas tem
public void foo(String…a)
o famoso varargs.
bar é sobreescrito, mas foo é sobrecarregado. Beta tem 3 métodos:
o que faz cada um deles depende de quem vc instanciou com new.
Polimorfismo!
D
DarkRayman
O metodo foo em Beta foi sobrecarregado.
Assim quando vc chama a.foo(“s”),
a tem referencia a Alpha, mas é instancia de Beta, em Alpha não existe o metodo foo(String a) e sim foo(String…a).
Então ele imprimi Alpha:foo.
o que faz cada um deles depende de quem vc instanciou com new.
Polimorfismo!
pois é, Beta tem estes tres métodos justamente por causa da sobrecarga. Mas a minha instancia de a faz referencia a Beta, por isso acho que deveria chamar o metodo foo de Beta e não de Alpha.
peczenyj
Alfa a = new QQCOISA();
a só tem acesso aos métodos de Alfa – as assinaturas
QQCoisa b = (QQCoisa) a;
b tem acesso aos métodos de QQCoisa – as assinaturas
marcosbrandao
caramba…
é verdade, isso é regra básica de polimorfismo.
Agora que ma liguei…
Hoje to com a cabeça meio longe…
D
DaviPiala
Eu não tinha reparado nos var-args e tava pensando que ia sair isso