Baixe o material de estudo
Fala, meus consagrados! Beleza?
O principal conceito relacionado ao polimorfismo vem da herança somada com os métodos sobrescritos na subclasse:
- É a propriedade de duas ou mais classes derivadas de uma mesma superclasse responderem a mesma mensagem;
- Mas cada uma de uma forma diferente;
- Ocorre quando uma subclasse redefine um método existente na superclasse;
- Métodos sobrescritos (overriding).
Vamos trabalhar com um exemplo prático.
Exemplo de superclasse Animal:
public class Animal {
public void emitirSom() {
System.out.println("Som do animal");
}
}
Exemplo de subclasse Cachorro:
public class Cachorro extends Animal {
@Override
public void emitirSom() {
System.out.println("Latindo...");
}
}
Exemplo com as classes:
public class Main {
public static void main(String[] args) {
// Variável objeto animal apontando para um objeto da superclasse Animal.
Animal animal = new Animal();
animal.emitirSom();
// A mesma variável objeto animal agora apontando para um objeto da subclasse Cachorro.
animal = new Cachorro();
animal.emitirSom();
}
}
Resultado da execução do código:
Som do animal
Latindo...
O método emitirSom() da superclasse Animal foi dado de herança para a subclasse Cachorro, porém, essa classe sobrescreveu, dando uma implementação mais específica.
Dentro do assunto de polimorfismos, temos o conceito de ligação dinâmica, também conhecida como ligação tardia ou ligação em tempo de execução. Essa ligação é um mecanismo pelo qual a chamada de um método é resolvida em tempo de execução. Isso é essencial para o polimorfismo, especialmente para o polimorfismo de inclusão.
O compilador Java não sabe qual versão do método será executada durante a compilação, pois isso depende do tipo real do objeto durante a execução. Quando um método é chamado em uma referência de objeto, a versão do método a ser executada é determinada pelo tipo real (não pelo tipo de referência) do objeto que foi criado em tempo de execução.
Exemplo de superclasse Animal:
public class Animal {
public void emitirSom() {
System.out.println("Som do animal");
}
}
Exemplo de subclasse Cachorro:
public class Cachorro extends Animal {
@Override
public void emitirSom() {
System.out.println("Latindo...");
}
}
Exemplo com as classes:
public class Main {
public static void main(String[] args) {
Animal rex = new Cachorro();
// Ligação dinâmica ocorre aqui.
rex.emitirSom();
}
}
Resultado da execução do código:
Som do animal
Latindo...
No código acima, quando rex.emitirSom() é chamado, o compilador não sabe ao certo qual método falar será executado. Em tempo de execução, a JVM identifica que rex (apesar de ser do tipo Animal) aponta para um objeto do tipo Cachorro e invoca o método falar sobrescrito na classe Cachorro. Isso é possível devido à ligação dinâmica e o comportamento dinâmico que resulta é o polimorfismo.
A ligação dinâmica e o polimorfismo trabalham juntos para garantir que o comportamento correto seja executado, não importa como as referências de objeto são tipadas. O polimorfismo permite a flexibilidade e a extensibilidade na arquitetura de um aplicativo, enquanto a ligação dinâmica garante que a implementação correta seja executada.
Espero que tenham gostado!
Forte abraço e até a próxima jornada!
_________________________
Professor Rogerão Araújo
Quer ficar por dentro dos concursos públicos abertos e previstos pelo Brasil? Clique nos links abaixo:
CONCURSOS 2025
CONCURSOS ABERTOS
QUESTÕES DE CONCURSOS
Receba gratuitamente no seu celular as principais notícias do mundo dos concursos. Clique no link abaixo e inscreva-se:
TELEGRAM
Fonte: Gran Cursos Online