Instantiating an Object with a Different Reference

5

I am learning Polymorphism in Java, but I have some doubts.

public class Animal {

    int numPatas;

    public void fazerBarulho() {

        // Código do Método
    }

    public void comportamento() {

        // Código do Método
    }
}

public class Felino extends Animal {

    public void comportamento() {

        // Aqui o método é reescrito,
        // pois um Felino tem um
        // comportamento próprio
        // de um felino.

    }
}

public class Gato extends Felino {

    // O Gato é um Felino e ao mesmo
    // tempo é um animal.
    // Então ele tem um numero de patas e,
    // o comportamento de um felino.

    public void fazerBarulho() {

        // Mas gato tem um barulho único
        // de um gato.
        // Pois um gato não faz o mesmo
        // barulho de um leão.

    }
}

This concept of polymorphism I understand. But what happens when we do this?

Animal umAnimal  = new Gato();
    
asked by anonymous 20.07.2014 / 21:23

2 answers

6

When you instantiate a Cat in the Animal, this animal will have all the properties of the cat as you can see in the example below.

However, it will remain an animal and any additional cat or feline method will not be available in the same (without casting).

The code below is in Gist .

Principal.java

public class Principal {
    public static void main(String[] args) {
        Animal bicho = new Gato();
        System.out.println("Num patas do bicho " + bicho.numPatas);
        bicho.fazerBarulho();
        //bicho.gatoMia(); <- não pode porque não está definido no Animal
        Gato gato = (Gato) bicho;
        gato.gatoMia();
    }
}

Output:

  

On an animal's feet 4

     

MIAU

     

MIAU

Animal.java

public class Animal {
    int numPatas;

    public void fazerBarulho() {

        // Código do Método
    }

    public void comportamento() {

        // Código do Método
    }
}

Felino.java

public class Felino extends Animal{
       public Felino(){
           this.numPatas = 4;
       }
}

Gato.java

public class Gato extends Felino{
    @Override
    public void fazerBarulho(){
        System.out.println("MIAU");
    }
    public void gatoMia(){
        this.fazerBarulho();
    }
}

Note

In this case, it would be recommended that Animal be an interface as shown below:

public interface Animal {
    public int getNumPatas();
    public void fazerBarulho();
    public void comportamento();
}

And then the other classes would implement such an interface:

public class Felino implements Animal {
    int numPatas;
    public Felino() {
        this.numPatas = 4;
    }

    @Override
    public int getNumPatas() {
        return numPatas;
    }

    @Override
    public void fazerBarulho() {
        throw new UnsupportedOperationException("Não disponível.");
    }

    @Override
    public void comportamento() {
        throw new UnsupportedOperationException("Não disponível.");
    }
}

Note that Cat does not need to be modified (with these recommendations and the only change in the Main Class is bicho.getNumPatas() instead of bicho.numPatas .

    
20.07.2014 / 22:31
4

When you do:

Animal umAnimal  = new Gato();

It means that the variable anAnimal, of the Animal type, will behave like a Cat.

If you create a walk method in the Animal class, then override this walk method in the Cat , when you call anAnimal.andar (); at runtime will be invoked method written in the Cat class and not what was written in the Animal , since what is in memory (which has been instantiated) is a Cat object.

If you want to better understand concepts of inheritance, rewrite, and polymorphism, I would advise you to click here .

    
20.07.2014 / 22:41