Dúvida sobre polimorfismo

4 respostas
raribeir

Olá, estou aprendendo Java e não encontrei alguma explicação que me fizesse entender um ponto do polimorfismo.
Imaginem que eu tenho uma classe Carro e uma classe Ferrari que estende carro
Na hora de instanciar um objeto Ferrari eu posso fazer:

Carro meucarro = new Ferrari();

ou

Ferrari meucarro = new Ferrari();

Pelo q eu entendi, dá na mesma e os métodos que funcionam com objetos do tipo Carro funcionarão com qlq uma das duas formas.
Há alguma razão pra eu preferir ou um ou outro?

4 Respostas

Pablo_Enrique_Gomes

Carro é do tipo abstrato nerh ? uma classe abstrata não pode ser instanciada mas pode receber uma instancia o primeiro modo é totalmente desnecessário pois ferrari já herda carro , logo herdando todos os metodos , Carro meucarro = new Ferrari(); << quando você faz isso o objeto meu carro tanto vai acessar os metodos da classe Carro é da ferrari É desnecessário pois ferrari herda carro logo de qualquer forma ele vai ter acesso aos metodos não a nenhum reaproveitamento , isso séria mais lógico sé ferrari não estendesse carro pois assim ele teria acesso aos metodos da classe carro sem precisar herda-lo.

wldomiciano

Sim, há razões para preferir ou um ou outro e com a pratica vc vai pegando, mas vou dar um exemplo bem básico e besta, ok?

class Loja {
    /* ... */
    public void adicionarNovoCarro(Ferrari carro) { /* ... */ }
}

A Loja possui uma lista de carros, e o método para adicionar um novo carro a esta lista. Porém, do jeito que eu defini o método acima, minha loja só pode conter ferraris em sua lista. Agora, se eu fizer assim:

class Loja {
    /* ... */
    public void adicionarNovoCarro(Carro carro) { /* ... */ }
}

Eu seria livre para adicionar qualquer carro.

public static void main(String... args) {
    Carro fusca = new Fusca();
    Carro ferrari = new Ferrari();
    Carro gol = new Gol();

    Loja loja = new Loja();

    loja.adicionarNovoCarro(fusca);
    loja.adicionarNovoCarro(ferrari);
    loja.adicionarNovoCarro(gol);
}

É bobo, mas espero que lhe de pelo menos uma luz. Bons estudos!

raribeir

Pesquisando um pouco mais eu achei este artigo: http://pt.stackoverflow.com/questions/73633/arraylist-x-list
Há uma grande explicação sobre o assunto mas algumas coisas me chamaram atenção fazendo um paralelo entre List e ArrayList:

List é uma interface. ela define o comportamento das listas da api de collections.

ArrayList é um tipo de imlpementação dessa lista, assim como LinkedList também é uma implementação de List.

Quando você define desta forma:

List myList = new ArrayList();
você só pode chamar métodos e membros que pertencem a List. Se você defini-lo como :

ArrayList myList = new ArrayList();
você vai ser capaz de chamar métodos específicos ArrayList e membros específicos uso ArrayList além daquelas herdadas da Lista.

FernandoFranzini

Artigo sobre - https://fernandofranzini.wordpress.com/2010/07/07/pizzaria-polimorfica-2/
Aula Gratis - https://fernandofranzini.wordpress.com/2016/10/26/for-j-ead-aula-gratis-interfaces-java/
Curso Completo para vc entender o uso de interfaces - https://for-j.myedools.com/jse-polimorfismo

Criado 11 de janeiro de 2017
Ultima resposta 17 de jan. de 2017
Respostas 4
Participantes 4