Bom dia Felipe, na verdade o Polimorfismo depende da herança. Assim, imagina que temos uma classe Aluno e uma classe Instrutor e os dois tem um nome:
class Aluno {
private String nome;
// get e set de nome
}
class Instrutor {
private String nome;
// get e set de nome
}
Dai criamos uma classe que gerencia aluno e instrutores, pois dado um aluno ou instrutor(quando digo dado é passado como parâmetro) precisamos imprimir seu nome:
class GerenciaAlunoEIntrutor {
public void imprimeNomeAluno(Aluno aluno) {
System.out.println(aluno.getNome());
}
public void imprimeNomeInstrutor(Instrutor instrutor) {
System.out.println(instrutor.getNome());
}
}
Podemos pensar: Foi necessário repetir o nome nas duas? Então podemos criar uma super classe Pessoa que tenha nome e ambas herdem. Isso é a Herança. Se entrar Diretor, também pode herdar Pessoa.
A herança fez com que repetíssemos menos código.
Agora vem outro porém, como faremos para imprimir o nome do Diretor na GerenciaAlunoEIntrutor ?
Teríamos que mudar o nome para GerenciaAlunoEIntrutorEDIretor e colocar outro método. Imagina o tamanho dessa classe caso tenhamos outros tipos?
Ai vem o polimorfismo, pois com ele podemos ter o mesmo tipo de referencia para varios objetos diferentes:
Pessoa p1 = new Aluno();
Pessoa p2 = new Intrutor();
Pessoa p3 = new Diretor();
Então porque podemos fazer isso, podemos ter apenas um método em GerenciaAlunoEIntrutor, que recebe pessoa, e sabemos que toda pessoa tem um nome e podemos imprimir:
class GerenciaAlunoEIntrutor {
public void imprimeNomeAluno(Pessoa pessoa) {
System.out.println(pessoa.getNome());
}
}