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.
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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.
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