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:
Carromeucarro=newFerrari();
ou
Ferrarimeucarro=newFerrari();
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?
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?
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:
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.