Srs…
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?
public class Teste {
public static void main(String[] args) {
Alpha a = new Beta();
Beta b = (Beta)a;
a.foo("s");
b.foo("s");
a.bar("s");
b.bar("s");
}
}
class Alpha{
public void foo(String...a){
System.out.println("Alpha:foo");
}
public void bar(String a){
System.out.println("Alpha:bar");
}
}
class Beta extends Alpha{
public void foo(String a){
System.out.println("Beta:foo");
}
public void bar(String a){
System.out.println("Beta:bar");
}
}
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…
alguem pode me explicar isso? linha 13
public void foo(String...a)
se retirar os … muda a saida.
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:
public void foo(String a)
public void foo(String…a)
public void bar(String a)
o que faz cada um deles depende de quem vc instanciou com new.
Polimorfismo!
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.
Eu acho que é isso.

String… a é o famoso varargs
a, nesse caso, será um array, e vc pode fazer
a.foo(“um”);
a.foo(“um”,“dois”);
a.foo(“um”,“dois”,“tres”);
[quote=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:
public void foo(String a)
public void foo(String…a)
public void bar(String a)
o que faz cada um deles depende de quem vc instanciou com new.
Polimorfismo![/quote]
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.
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
caramba…
é verdade, isso é regra básica de polimorfismo.
Agora que ma liguei…
Hoje to com a cabeça meio longe…
Eu não tinha reparado nos var-args e tava pensando que ia sair isso
Beta:foo
Beta:foo
Beta:bar
Beta:bar