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

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