Eu avancei um pouco nos cursos e peguei um exemplo útil de instanciar usando uma referência mais genérica que seriam as arrays. Por exemplo:
Conta[] contas = new Contas[5];
No exemplo você poderia armazenar objetos ContaCorrente ou ContaPoupanca. Mas você poderia criar um array da seguinte maneira:
Object[] objetos = new Object[5];
e, nesse exemplo, você também poderia criar e guardar ContaCorrete ou ContaPoupanca. Afinal, pode guardar qualquer coisa que seja um objeto. String, um int ou double, um boolean... Mas aí você ficará limitado aos métodos que todo e qualquer objeto armazenado possa invocar. Exemplo:
objetos[0].toString() ;
é um método que funciona com todo objeto, independente do tipo de objeto armazenada em "objetos[0]". já
ContaCorrente contaCorrente = new ContaCorrente(11, 222);
objetos[0] = contaCorrente;
contaCorrente.depositar(25); // compila
objetos[0].depositar(25)// não compila
apesar de ambos referenciarem o mesmo objeto, são referencias que irão funcionar de maneira diferente. O método "deposita" pertence à ContaCorrente, e não a Object. Ao usar "objetos[0].", eu perco algumas funcionalidades para ganhar outras. Então:
ContaCorrente contaCorrente = new ContaCorrente(11, 222);
objetos[0] = contaCorrente;
objetos[0] = "Não há contas aqui.";
eu posso mudar e armazenar uma String, por exemplo.