Dúvidas com overriden e overload

2 respostas
C

Olá pessoal estou com um dúvida terrível…
Estou estou estudando overrinden e overloaden

Vi num seguinte exemplo:

public class Animal{
   public void eat(){
      System.out.println("Animal");
  }
}

class Horse extends Animal{ 
   public void eat(){
      System.out.println("Horse");
   }

   public void eat(String s){
      System.out.println("Duvida");
   }

   public static void main(String[] args){
       Animal ah = new Horse(); // imprimi Horse       
   }
}

Eu não entendi muito bem. Confundi com o outro exemplo abaixo:

class Animal{}
calss Horse extends Anima{}
class UseAnimals{
  public void doStuff(Animal a){
    System.out.println("Animal");
  }

  public void doStuff(Horse h){
    System.out.println("Horse");
  }

    public static void main(String[] args){
       Animal ah = new Horse(); // imprimi Animal
   }
}

Ficou confuso não entendi nada.
Esses exemplos são do Capitulo 5 do livre Certificação 1.4 da Kathie Sierra.

Alguem pode me dar uma :idea:

No primeiro achei que fosse imprimir animal, pois os metodos estao sendo overload e a que metodo chamar é decidido pela referencia e não ao objeto em execução…

2 Respostas

J

Olá,

No primeiro exemplo o metodo chamado é o do objeto real que está sendo utilizado, não o do tipo da referencia, acho que foi isso que você confundiu, nem existe um objeto Animal, como você poderia chamar o metodo eat() dele… o objeto que existem em memoria é um Horse, então o metodo eat() chamado é o do Horse.

No segundo caso, acho que você esqueceu uma linha do codigo, ele passa essa variavel ah para o metodo doStuff() não?

Aí nesse caso, o metodo espera uma variavel do tipo Animal, e é exatamente o que você tem, uma variavel do tipo Animal (que referencia um objeto Horse, mas o objeto que é referenciado não interfere em nada, pois o que está sendo passado é a referencia…), então a referencia ah que é do tipo Animal, vai para o metodo doStuff(Animal a);

Lembre-se que quando você passa um parametro, você está passando a referencia, então o que importa é o tipo da referencia, não o objeto referenciado…
Já quando você chama um metodo, você está chamando o metodo do objeto, não da referencia, até porque referencia não tem metodo, quem tem metodo é objeto…

C

Legal…

Agora entendi…

Valeu!!

Criado 21 de setembro de 2006
Ultima resposta 21 de set. de 2006
Respostas 2
Participantes 2