Dúvida Polimorfismo

Boa tarde glr, estava estudando Polimorfismo e me surgiu uma dúvida nos seguintes cenários:

  1. Classe abstrata(Pessoa); Classes filhas(aluno;secretário;diretor)
    -> Nessa situação qual a diferença de instanciar dessa forma Aluno aluno1 = new Aluno(); para esta Pessoa aluno1 = new Aluno();, haveria alguma diferença ou é basicamente a mesma coisa?

  2. Quando um objeto muda de tipo em tempo de execução, ele deixa de ser do tipo anterior e se torna exclusivamente do novo tipo ou mantém as características herdadas previamente?
    Ex: Pessoa aluno1 = new Aluno(); -> aluno1 = new Diretor();

Ao instanciar dessa forma, vc conseguirá acessar apenas os métodos declarados em Pessoa. Para acessar os métodos de alunos, teria que fazer um cast (o que é possível por causa da herança nesse caso):

Pessoa aluno1 = new Aluno();
Aluno a = (Aluno) aluno1;
a.metodoQueSohTemNoAluno();

Nesse caso, ele deixa de ser um aluno, porém, ainda se trata de uma pessoa. Você não conseguirá mais fazer o cast para o tipo Aluno.

Pessoa aluno1 = new Diretor();
Aluno a = (Aluno) aluno1; // erro de ClassCastException
1 curtida

O objeto não mudou de tipo, você instanciou um objeto novo e aproveitou a mesma variável para referenciar o outro objeto (muitas vezes não é o que você quer).

1 curtida