Qual é a saída?

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 :cry: . 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. :slight_smile: :slight_smile:

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

hummm, vlw

[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