Criação de Objetos, Henrança ?

4 respostas
O

Boa Tarde Pessoal,

Esta pergunta pode ser bem idiota mas como estou no inicio dos estudos ainda não localizei uma resposta que eu consiga entender claramente.

Tenho duas classes, Pessoa e Funcionario certo;

Class Funcionario extends Pessoa, qual a diferença se eu nao usar extends e na criação do objeto usar

Funcionario F = new Pessoa();

Forte abraço

4 Respostas

peczenyj

herança é um tipo de relação É UM

Tudo herda de Object. Logo vc pode fazer

Object o1 = new Pessoa();

Object o2 = new Funcionario();

Object o3 = new String();

Object o4 = new Object();

agora se não existe nenhuma relação entre Funcionario e Pessoa, vc náo pode fazer isso fera

Funcionario F = new Pessoa();
Pessoa P = new Funcionario();

Dá zika. não faz sentido isso.

Agora… se Funcionario Extends Pessoa, entáo Funcionario É UM Pessoa. Existe uma relação polimorfica ai.

isso funciona

Pessoa P = new Funcionario();

agora o contrario não. mas pq?

Imagine, por exemplo, se funcionario tiver um metodo que pessoa não tem, vc nao pode fazer

Funcionario F = new Pessoa();
F.metodoQuePessoaNaoTem(); /* ta loko ?!?! */

A sua pergunta não é idiota. lhe falta pratica pra pegar estes detalhes.

Por exemplo, todos os metodos em Java são virtuais. De uma estudada sobre isso.

E nem falamos de Interfaces :slight_smile:

B

Aproveitando a oportunidade.

Qual a diferença de eu fazer isso:

Funcionario F = new Funcionario();

E isso?

Pessoa P = new Funcionario();

Já que funcionário extends pessoa, ele teria todos os métodos de pessoa. Sendo assim, é necessário fazer apenas isso, certo?

Funcionario F = new Funcionario();

É mais pra questão de legibilidade?

R

Quando você faz isso
Funcionario F = new Funcionario();
A sua variavel F terá acesso aos metodos de Funcionarios e também dos metodos de Pessoa.

Porém, quando você faz isso
Pessoa P = new Funcionario();
Você terá acesso somente aos metodos da classe Pessoa, haja visto que sua referência é do tipo pessoa.

A questão não é de legibilidade, e sim de polimorfismo.
Uma variavel Pessoa p pode receber objetos de todos os subtipos dela, porém se a variavel for do tipo Funcionário, ela pode receber somente objetos da Hierarquia de Funcionarios pra baixo:
Pessoa p = new Funcionario(); p = new PessoaFIsica(); p = new PessoaJuridica();

E assim por diante.

peczenyj

Polimorfismo

um exemplo do meu dia a dia:

Eu tenho que envio 2 tipos de operações em 2 clientes ( yahoo e google )

Yahoo e Google sao totalmente diferentes

Eu tenho uma interface comum chamada Client que expoe o metodo send

As operacoes possiveis sao: adicionar ou remover

Entretanto fazer uma a uma é demorado. Eu posso juntar varias operações em um array.

Se a interface é a mesma eu posso fazer:

Client g = new Google();
Client y = new Yahoo();
Client clients[] = new Client[]{ g, y };
Operation ops[] = ... /* varias operações diferentes */

for( Client c : clients ){ c.send( ops ); }

Vantagens: se amanhã surgir outras operações ou clientes eu tenho uma solução que funciona e mudanças mínimas são necessárias :blush:

As vezes se usa uma Interface ou Class Abstrata tipo

List x = new ArrayList();

Isto é útil pois se vc precisar usar uma outra implementação de List vc muda UM lugar.

Criado 20 de outubro de 2016
Ultima resposta 22 de out. de 2016
Respostas 4
Participantes 4