Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Herança, reescrita e polimorfismo

Pessoal, boa noite. Eu vi a aula! Só não consegui entender um pequeno detalhe. O que é polimorfismo afinal? E como ele é aplicado na prática? Obrigado.

7 respostas
solução!

Olá Felipe! Primeiramente gostaria de falar pela minha experiência. Acredito que após assistir a aula de interfaces você conseguirá entender o conceito de Polimorfismo melhor.

Bom, não sei se conseguirei explicar bem, mas tentarei com as minhas palavras. Nós sabemos que um Quadrado e um Círculo são Formas Geométricas, certo? Porém, para fazer o cálculo da área de cada um deles, a "fórmula" é diferente. Mas mesmo sendo diferente, nós sempre poderemos calcular a área dos dois.

Então suponhamos que nós temos as seguintes classes:

public abstract class FormaGeometrica {
    public abstract double calculaArea();
}
public class Quadrado extends FormaGeometrica {
    private double lado;

    public Quadrado(double lado) {
        this.lado = lado;
    }

    @Override
    public double calculaArea() {
        return lado * lado;
    }
}
public class Circulo extends FormaGeometrica {
    private double raio;

    public Circulo(double raio) {
        this.raio = raio;
    }

    @Override
    public double calculaArea() {
        return Math.PI * (raio * raio);
    }
}

Como podemos perceber, para cada um fizemos a implementação do método calculaArea de forma diferente, certo? O que mudou aqui é o seguinte: sendo filhas da classe FormaGeometrica, as classes Quadrado e Circulo PRECISAM "saber fazer" o cálculo da área. Mas a forma como o cálculo é feito, para a classe FormaGeometrica não importa, pois inclusive a mesma não poderá ser instanciada (apenas suas filhas).

E onde entra o Polimorfismo?

Por exemplo, suponhamos que nós temos um sistema onde o usuário seleciona a forma geométrica que deseja e um determinado valor (no caso do Quadrado o tamanho do lado, e no caso do Círculo o raio).

Este sistema tem que retornar para o usuário qual a área da forma geométrica que ele escolheu. Levando em consideração que toda classe que é filha de FormaGeometrica TEM QUE IMPLEMENTAR O MÉTODO calculaArea, ao invés de criamos 2 métodos para exibir a área dessa forma e passar para o nosso programa um Quadrado ou Circulo, passamos a FormaGeometrica.

public class TestaClasses {
    public static void main(String[] args) {
        Quadrado f1 = new Quadrado(10);
        Circulo f2 = new Circulo(10);

        imprimeAreaDaForma(f1);
        imprimeAreaDaForma(f2);
    }

    private static void imprimeAreaDaForma(FormaGeometrica f) {
        System.out.println("Área do " + f + ": " + f.calculaArea());
    }
}

Ou seja: Independente da forma geométrica, o usuário poderá saber qual a sua respectiva área. Observe que eu incluí a variável f no print. Quando pedimos para exibir a variável desta forma, ele exibe a referência da classe que está sendo usada para calcular a área.

Se possível teste as classes que talvez acho que fique mais claro.

Em suma, o polimorfismo permite que as nossas classes possuam várias "MANEIRAS DE FAZER UMA TAREFA", mesmo que o objetivo da tarefa seja o mesmo para elas. Neste exemplo, o objetivo era obter a área de um Quadrado ou de um Círculo.

Espero ter ajudado mais que atrapalhado suas ideias, rs... Qualquer coisa é só postar aqui que tentarei ajudar, ok?

Felipe,

Conseguiu entender a explicação da Ana? Se ficou mais alguma dúvida só falar!

Abraço!

Nops, obrigado.

Bom dia Ana. Referente ao seu exemplo eu entendi. Na execução porque aparece Area do Quadrado@659e0bfd:100.0 Area do Circulo@2a139a55:314.1592653589793

O que significa esse @ e os numeros. Será que é por causa da plataforma que eu estou utilizando que é linux ?

Samuel esse @ Indica que você está acessando a localização da variável na memoria

Samuel, nesse caso indica que você está acessando os valores de localização do objeto na memória!

hummm ok obrigado