Enviar um café pro programador

Pode me ajudar a transformar cafeína em código?

Manipulando polimorficamente subclasses

Agora que você domina completamente os conceitos de herança, polimorfismo e abstração, vamos aos exemplos práticos - códigos em Java.
Vamos mostrar como é possível uma superclasse abstrata manipule suas subclasses concretas.

Superclasse abstratas se tornando subclasses concretas

Uma poderosa arma do polimorfismo e abstração em Java é a capacidade que temos de manipular as subclasses através de uma superclasse. Como cada subclasse concreta foi criada com métodos diferentes, elas agirão de forma diferente, conforme vimos em nossos tutoriais sobre polimorfismo em Java. Isso nos dá um incrível poder e versatilidade, afinal podemos usar qualquer objeto que seja uma subclasse de nossa classe abstrata. Vamos usar o exemplo de nosso tutorial sobre Polimorfismo, Classes e Métodos Abstratos: o exemplo dos animais. Através da classe abstrata "Animal", criamos 3 objetos: uma vaca, um gato e um carneiro. Vamos fazer a classe "Animal" receber uma referência de cada um desses objetos e invocar seu método 'som()', que é abstrato e age de forma diferente em cada subclasse. Ou seja, vamos manipular polimorficamente os animais. Começamos essa manipulação ao fazer com que um Array de "Animal" receba os objetos da classe "Vaca", "Gato" e "Carneiro": Animal bichos[] = {mimosa, bichano, barnabe}; Depois, fazemos com que um objeto da classe "Animal", o 'animal' tenha uma referência para cada um desses objetos (mimosa, bichano e barnabé): for(Animal animal : bichos) { System.out.print("Esse animal é da classe " + animal.getClass().getName() + " e faz "); animal.som(); System.out.println(); } Note como ficou simples chamar todos as subclasses da classe abstrata "Animal", fazendo com que o objeto 'animal' receba cada um dos tipos ("Vaca", "Gato" e "Carneiro") ! Imagine se fosse uma aplicação real, de um game, com dezenas ou centenas de animal, que a cada 3 segundos tivessem que fazer seu som? Imagine a trabalheira que seria invocar o método de cada objeto desse? Agora você já sabe que é melhor manipular polimorficamente cada objeto que é subclasse da classe abstrata! Aproveitamos também para mostrar a utilidade de se saber os métodos da classe Object. No caso, usamos o método getClass(), que retorna 'classe NomeDaClasse' e o método getName() que retorna só o 'NomeDaClasse'

Código Java de como manipular polimorficamente as subclasses

-->zoo.java
public class zoo {

    public static void main(String[] args) {
        Vaca mimosa = new Vaca();
        Gato bichano = new Gato();
        Carneiro barnabe = new Carneiro();

        Animal bichos[] = {mimosa, bichano, barnabe};
        
        for(Animal animal : bichos)
        {
                System.out.print(animal.nome + " é da classe " + animal.getClass().getName() + ", tem " + animal.numeroPatas + " patas e faz ");
                animal.som();
                System.out.println();
        }
        
    }

}
-->Animal.java public abstract class Animal { protected String nome; protected int numeroPatas; public abstract void som(); } -->Vaca.java public class Vaca extends Animal { public Vaca(){ this.nome = "Mimosa"; this.numeroPatas = 4; } @Override public void som(){ System.out.print("MUUUU"); } } -->Gato.java public class Gato extends Animal{ public Gato(){ this.nome = "Bichano"; this.numeroPatas = 4; } @Override public void som(){ System.out.print("MIAU"); } } -->Carneiro.java public class Carneiro extends Animal{ public Carneiro(){ this.nome = "Banabé"; this.numeroPatas = 4; } @Override public void som(){ System.out.print("BÉÉÉ"); } }

4 comentários:

Tedesco disse...

não entendi esse laço for:

for(Animal animal : bichos){...}

no for vc precisa definir os limites e um "contador" não?

parabéns pelo site, muito bem explicado!

Apostila Java Progressivo disse...

Olá Tedesco,

Esse laço for é um laço especial para arrays.
Já falamos sobre ele no Tutorial:
Laço for para Arrays, for each, for enhanced ou laço for avançado

Carlos Moreira disse...

Muito bom, aprendendo muito com o Java Progressivo, melhor que encontrei na internet até agora.
Gostaria muito que tivesse um PHP Progressivo.
`Parabéns

Mike disse...

Realmente ótimo esse site!!!

Contribuir com o Java Progressivo

Que tal apoiar e fazer crescer o ensino da programação no Brasil ?

Ajudar nosso país a crescer e se desenvolver cada vez mais, tecnologicamente?

Clica abaixo pra saber mais!

Apoiar o Projeto Progressivo


Tutoriais de Java