Olá Wesley, tudo bem?
Fazer
Conta conta = new ContaPoupança();
é o que nos chamamos em orientação a objetos de polimorfismo (https://goo.gl/diFliK (leitura recomendada)), e uma das vantagens de se utilizar hierarquias de Herança e/ou criar interfaces.
Como criamos uma hierarquia de herança, podemos dizer que ContaPoupanca
é uma Conta
. Isso significa que podemos criar um objeto de um subtipo (ContaPopanca
) e ele ser referenciado por uma variável de um supertipo (Conta
). Isso ocorre justamente porque ContaPoupanca
é uma Conta
. Por isso dizemos que o relacionamento de herança é do tipo é-um.
A vantagem de usar o supertipo é que podemos trocar a implementação (subtipo) a qualquer momento sem quebrar o código que funciona. Isso significa que o seguinte trecho código deve funcionar:
Conta conta = new ContaPoupança();
conta = new ContaCorrente();
Pois conta
pode referenciar qualquer objeto que seja de uma classe filha de Conta
. Aqui talvez a vantagem não apareça, mas imagine o seguinte método:
public void fazAlgumaCoisa(Conta conta)
{
conta.deposita(10);
}
Agora somos capazes de passarmos qualquer objeto mais específico, por exemplo:
fazAlgumaCoisa(new ContaPoupanca());
fazAlgumaCoisa(new ContaCorrente());
Não ficamos presos a um tipo de conta específico. Talvez as vantagens de programar dessa forma não apareçam pra você nesse momento. Mas no geral é uma boa prática generalizar as coisas.
As vantagens e desvantagens de usar herança e etc, também devem se tornar mais claras a medida que for evoluindo nos conceitos de orientação a objetos. :)
Faz sentido? Se tiver mais dúvida pode avisar.
Abraço.