Mais uma de overload/override

1 resposta
ricardolecheta

o que imprime? :)

class Pessoa
{
	void teste()
	{
		System.out.println("Pessoa");
	}

	void callPessoa(Pessoa p)
	{
		System.out.println("overload: Pessoa");
		p.teste();
	}

	void callPessoa(Filho f)
	{
		System.out.println("overload: Filho");
		f.teste();
	}
}

class Filho extends Pessoa
{
	void teste()
	{
		System.out.println("Filho");
	}
}

public class TestOverride
{
	public static void main(String[] args)
	{
		Pessoa p = new Filho();
		p.callPessoa(p);
	}
}

1 Resposta

Daniel_Quirino_Olive

overload: Pessoa
Filho

:wink:

[editado]
Opa, a explicação: a classe Filho não sobreescreve o método “callPessoa”, logo a chamada deste método é feita para a classe que esteja um nível acima na hierarquia de herança (no caso, a classe Pessoa). Daí vem a mensagem "overload: Pessoa"
No entanto, como se pode ver no código da classe Pessoa, há dois método chamados “callPessoa”, sendo que um recebe um objeto do tipo Filho e outro do tipo Pessoa. Como Filho é um tipo de Pessoa (alguns pais diriam que isso vai depender do ponto de vista :smiley: ) e como a instância “p” é do tipo “Pessoa”, logo é escolhido o método callPessoa(Pessoa p) para ser executado. Seguindo o código deste método, há uma chamada para o método teste(). Como a classe Filho sobreescreve este método (e este, que foi passado como parâmetro, é uma sub-classe de Pessoa), então esta versão de método que será executada. E daí é que sai a mensagem “Filho”.

:!: Sugestão: coloquem um breakpoint na linha “p.callPessoa§;” e rodem o programinha em um debugger.
[/editado]

Criado 23 de setembro de 2003
Ultima resposta 23 de set. de 2003
Respostas 1
Participantes 2