Boa noite, Luis! Como vai?
A possibilidade de fazer referência a um objeto de várias formas se chama polimorfismo. Um dos conceitos mais importantes em programação orientada a objetos! Como vc bem citou, nesse caso que vc usou de exemplo, seriam válidas ambas as linhas a seguir.
Funcionario diretor1 = new Diretor();
Diretor diretor2 = new Diretor();
Agora imagine a seguinte situação: temos um sistema com diretores, advogados, gerenes, presidente, etc etc. Todos eles estendem a classe Funcionario
e eu quero construir um método que receba como parâmetro um funcionário qualquer e calcule o imposto de renda com base no salário. Se o polimorfismo não existisse, eu teria que criar um método desse pra cada tipo de funcionário que existe. Seria péssimo! Mas graças ao polimorfismo, podemos escrever um único método assim:
public double calculaIR(Funcionario f)
{
// Lógica do método omitida.
}
Como diretores, gerentes, presidentes e advogados estendem da classe Funcionario
esse código funciona perfeitamente em qualquer um dos casos a seguir!
calculaIR(new Diretor());
calculaIR(new Presidente());
calculaIR(new Advogado());
E dessa forma em vez de escrever milhões de métodos de cálculo de IR pra cada um dos tipos de funcionário, escrevo apenas um único método que serve para todos os funcionários! Bem melhor e mais bacana!
Pegou a ideia? Qualquer coisa é só falar!
Grande abraço e bons estudos, meu aluno!