Se uma classe implementa uma interface ou estende outra classe, qual a vantagem se criar uma variável com tipo da interface ou superclasse já que implementando e estendendo já possuo acesso aos atributos e métodos?
Ex.:
public class Pessoa {}
public class Empregado extends Pessoa {}
public EmpregadoTeste {
private Pessoa empregado;
//Por que não criar assim
private Empregado empregado;
}
Nessa situação que você descreveu, geralmente não tem vantagem mesmo.
Mas tem em outras:
Métodos fábrica: Eles permitem que em um ponto do seu sistema saiba qual é a pessoa específica seja criada, mas que no resto do seu sistema, isso seja indiferente:
public Pessoa carregarPessoa() {
//Aqui decide que tipo de pessoa criar e retornar
}
Criação de métodos para lidar com qualquer Pessoa:
[code]public double calcularAumento(Pessoa empregado) {
//Calcula o aumento de qualquer empregado
}
//Formas que poderia ser chamado
calcularAumento(pessoa);
calcularAumento(empregado);
[/code]