Nós vamos usar o polimorfismo principalmente quando desejarmos trazer alguma informação comum a todas as classes filhas para um lugar só. É possível entender o polimorfismo também como uma porta, pela qual todos os objetos das classes vão passar e deixar a resposta correspondente a um valor delas.
No caso da escola, por exemplo, podemos supor que os alunos, professores e quaisquer usuários da escola podem ir nas excursões, desde que paguem a taxa correspondente a cada um. Assim, foi criado um departamento pra receber os pagamentos, guardando o montante acumulado.
Na sala desse departamento vão entrar os Professores, Alunos, Diretores (note bem que são objetos das classes) e efetuar o pagamento. E aqui poderemos utilizar o polimorfismo, pois veja bem, temos objetos de diferentes classes que tem um método em comum, o "getTaxaDeExcursao", apenas a implementação é diferente, e queremos que cada um informe o valor correspondente a sua taxa no departamento e faça o pagamento.
A regra de taxa, no nosso caso, pode ser assim:
Professores pagam 100 reais;
alunos pagam 200;
Diretores pagam 50;
Em se tratando de código, temos:
Inicialmente, podemos tornar a classe usuarioEscola abstrata, o que significa que ela não pode ser instanciada, ou seja, não poderemos mais criar objetos usuarioEscola. Essa ideia faz sentido, porque não há ninguém na escola que é apenas usuário, a pessoa pode ser aluno, professor, diretor, mas não pode ser apenas usuário!
public abstract class UsuárioEscola {
private String nomeDoUsuario;
private String cpf;
private int idade;
Agora, podemos criar um método que também seja abstrato, a vantagem de fazer isso é que você obriga as classes filhas a implementarem o método!! Elas não vão compilar enquanto não implementarem o método! (colocar um corpo, instruções nele)
public abstract class UsuárioEscola {
private String nomeDoUsuario;
private String cpf;
private int idade;
public abstract double getTaxaDeExcursao();
Os métodos abstratos são declarados na classe mãe vazios e os filhos implementarão: Aluno
public class Aluno extends UsuárioEscola {
@Override
public double getTaxaDeExcursao() {
return 100;
}
Professor:
public class Professor extends UsuárioEscola{
@Override
public double getTaxaDeExcursao() {
return 100;
}
Agora, executando, poderíamos definir alguns objetos alunos e professores, e em seguida, em uma outra classe que representaria o departamento, fazer o polimorfismo estabelecendo que a referência é do tipo usuarioEscola, (um tipo mais abrangente), que só é possível ser feito porque tanto Professor quanto Aluno são, por herança, usuarioEscola! Veja bem, inicialmente, os objetos da classe Professor teriam uma referência do tipo professor :
public class AmbienteDeTestes {
Professor paulo = new Professor();
"paulo" armazena a referência para o objeto, certo? E o tipo de referência aqui é Professor! Mas também é possível que seja UsuárioEscola, pois um professor é um UsuárioEscola. E assim o polimorfismo vai trabalhar como porta para permitir que coloquemos a referência de diferentes objetos em um tipo mais abrangente, a classe mãe, e objetos de classes diferentes poderão usar um mesmo método, como o abaixo:
public class DepartamentoExcursao {
public double receberTaxa (UsuárioEscola g) {
return g.getTaxaDeExcursao();
}
}
Observe, ao invocar esse método na área de testes, precisaremos passar um parâmetro, que será a referência ao objeto, por exemplo, "paulo", que é a referência ao objeto professor. Essa referência assume o lugar de "g", e vai funcionar pois o tipo de referência será UsuárioEscola, a mais abrangente, e assim, qualquer objeto aluno ou professor poderá usar o método. Isso é polimorfismo, uma porta que permite diferentes tipos de objetos acessarem um mesmo objeto e nele imprimirem seus próprios métodos.
public class AmbienteDeTestes {
public static void main(String[] args) {
Professor paulo = new Professor();
Aluno lucas = new Aluno();
Aluno davi = new Aluno();
DepartamentoExcursao departamentoDeExcursao = new DepartamentoExcursao();
System.out.println(departamentoDeExcursao.receberTaxa(davi));
System.out.println(departamentoDeExcursao.receberTaxa(lucas));
System.out.println(departamentoDeExcursao.receberTaxa(paulo));
}
}
Esse assunto não é simples, se tiver dúvidas, recomendo fortemente assistir as aulas de polimorfismo e classes abstratas e anotar muito.
Bons Estudos!
Gentileza marcar o tópico como concluído, não sei se é possível, mas se tiver algum jeito :p