Formas diferentes de instânciar uma classe

Tenho 2 classes: Pessoa e Funcionario(subclasse).

Qual a diferença entre as instâncias abaixo e porque uma está certa e outra não?

Pessoa p = new funcionario();:heavy_check_mark:
Funcionario f = new pessoa ();:heavy_multiplication_x:

Basicamente, toda subclasse É UMA classe.
Ou seja, o compilador reconhece que você tem uma Pessoa dentro de Funcionario e, por esta razão, permite que se cria uma instância de objeto Pessoa a partir de um Funcionario.
Ocorre que o contrário não é válido, ou seja, você não consegue criar um Funcionário de uma Pessoa. Afinal, nem toda Pessoa é um Funcionário. O compilador não consegue entregar os detalhes que Funcionario possui e que não estão em Pessoa (o que é justificável, tendo em vista que Funcionario é uma especialização de Pessoa).

1 curtida

Pense da seguinte forma ok?
Uma pessoa pode ser também um funcionário, por isso que o primeiro funciona.
Agora um funcionário, é algo muito restrito, é um tipo muito “menor” do que pessoa, e por isso guardar uma pessoa em um funcionário não funciona.
Pensa em pessoa como se fosse um circulo grande, um conjunto grande, e funcionário um conjunto pequeno, talvez fique mais fácil de visualizar que um funcionário pode ser colocado dentro do tipo pessoa, mas o tipo pessoa não pode ser colocado dentro do tipo funcionário.

1 curtida

Pensando dessa forma faz mais sentido, obrigado!