[Resolvido]Não consigo entender polimorfismo

16 respostas
marciojesus

[Resolvido] Estou tentando entender poliformismo mais esta dificil, anida não consegui compreender a logica da coisa.
Se estou extendendo uma classe porque preciso copiar o mesmo metodo da super classe.
Por exemplo cao latir, gato minha, super classe animal, como faço para diferenciar uma da outra quanto for chamar gato ou cao preciso criar um objeto para cada um deles.

public class animal{

void comer(){

}

void beber(){

}

}

public class Felino extends Animal{

}

public class Gato extends Felino{

}

public class Canino extends Animal{

}
public class Cao extends Canino{

}

Quero saber como diferencio cada um de cada um, se preciso copiar os metodos em cada classe idem da classe animal.

16 Respostas

rmendes08

A beleza da coisa está justamente no fato de que você não precisa copiar os métodos e atributos da classe mãe para as classes filhas. Se você declara um método/atributo público na sua classe mãe, automaticamente você pode acessá-lo através de qualquer referência de uma classe filha, sem precisar repetir o código na classe filha.

marciojesus

Ate ai eu entendi, mas o problema como faço cao latir e gato miar sem copiar o metodo da classe abstrata ou super.
estou criando objetos para as classes mas nao consigo chamar os metodos sem copialos e alterar seus dados nas subclasses.

rmendes08

marciojesus:
Ate ai eu entendi, mas o problema como faço cao latir e gato miar sem copiar o metodo da classe abstrata ou super.
estou criando objetos para as classes mas nao consigo chamar os metodos sem copialos e alterar seus dados nas subclasses.

Bom, nesse caso você não está “copiando” o método, mas sobrescrevendo o método. Nesse caso você tem que repetir a declaração do método, mas a implementação é algo completamente novo. Mas se você ainda precisa da funcionalidade da classe mãe você pode acessá-la através da referência super. Nesse caso, você deve chamar o método da classe mãe assim:

class Mae { 
  void metodo(){ 
     /* faz alguma coisa */
   } 
}

class Filha extends Mae {
   @Override
   void metodo(){
      super.metodo();  //faz alguma coisa
      //faz algo a mais
   } 
}
marciojesus
class Animal{

void latir(){

System.out.print("");

}

void comer(){

System.out.print("");

}

}

class Dog extends Animal{

}

class Gato extends Animal{

}

Gostaria de saber como faço para fazer gato miar e cao latir sem alterar a classe animal?
Posso ate usar o super para chamar os metodos da classe animal, entao eu sobreescrevo o metodo interno da classe cao e dog?
Porque o que nao entendi e como vou fazer tais metodos sem alterar a classe principal, posso dizer na principal que cao vai latir, mas e o gato como eu faço?
valeu pela ajuda e que preciso entender antes de prosseguir no livro estou estudando para certificação.

rmendes08

Você não precisa alterar a classe Animal. A idéia da herança é essa.

brunorota

ficaria assim

public class Animal{

public void emitirSom(){

System.out.println("");

}

public class Gato extends Animal{

public void emitirSom(){

System.out.println("GATO MIA");

}

public class Cachorro extends Animal{

public void emitirSom(){

System.out.println("CACHORRO LATE");
}
}

public class Teste{

public static void main(String args[]){

Animal a = new Gato();
a.emitirSom();

Animal b = new Cachorro();
b.emitirSom();
}
}

entendeu?

FernandoFranzini
luceeferin

Passo 1:

aprender a escrever POLIMORFISMO.

marciojesus
<blockquote><div class="quote-author">marciojesus:</div>class Animal{

void latir(){

System.out.print("");

}

void comer(){

System.out.print("");

}

}

class Dog extends Animal{

}

class Gato extends Animal{

}

Gostaria de saber como faço para fazer gato miar e cao latir sem alterar a classe animal?
Posso ate usar o super para chamar os metodos da classe animal, entao eu sobreescrevo o metodo interno da classe cao e dog?
Porque o que nao entendi e como vou fazer tais metodos sem alterar a classe principal, posso dizer na principal que cao vai latir, mas e o gato como eu faço?
valeu pela ajuda e que preciso entender antes de prosseguir no livro estou estudando para certificação.

marciojesus

Muito obrigado pela dica, mas poderia dar uns exemplos, pois nao vi vantagem nenhuma, se preciso sobreescrever os metodos da super classe, qual a vantagem?

marciojesus

Valeu pela pizza ficou mas claro, vou dar uma lida com atenção.
grato

Rodrigo_Sasaki

pensa assim… se você tem uma lista com os mais variados animais… não sabe que animais tem la… mas cada um emite o seu tipo de som…

voce pode correr essa lista pelo tipo “genérico” que é Animal, e mandar cada animal emitir som, porém cada animal vai emitir seu próprio som, sem você ter que se preocupar com a implementação de cada um.

for(Animal animal : listaAnimais){
    animal.emiteSom(); 
}

tem uns exemplos mais práticos na apostila do curso FJ-11 da Caelum, talvez dê uma clareada… pode fazer o download que é gratuito

marciojesus

Valeu muito obrigado, ate ai eu entendi, mas preciso sobreescrever os metodos de cada classe ? Correto?
Preciso falar para cada classe o quem faz o que.
mesmo tendo esses metodos na classe mae.

rmendes08

marciojesus:
Valeu muito obrigado, ate ai eu entendi, mas preciso sobreescrever os metodos de cada classe ? Correto?
Preciso falar para cada classe o quem faz o que.
mesmo tendo esses metodos na classe mae.

Depende. Se o supertipo da sua hierarquia for uma classe você pode definir uma implementação padrão. Nesse caso, as subclasses podem utilizar a implementação padrão ou definir uma nova implementação. Existem casos e casos.

C

É meio difícil aprender polimorfismo porque ele ta sempre mudando.

marciojesus

Valeu muito obrigado pela dica, agora ficou mas claro as vantagem de herança.
Alias você sentiu vantagem em ter certificação para conseguir trabalho como programador ?

Criado 29 de março de 2012
Ultima resposta 29 de mar. de 2012
Respostas 16
Participantes 7