Polimorfismo em Java (Estático e Dinâmico)
⚡ Resumo Inteligente
Polimorfismo em Java Permite que uma única interface represente várias formas, de modo que um único nome de método se comporte de maneira diferente em classes relacionadas. É um pilar do design orientado a objetos que promove flexibilidade, reutilização de código e extensão limpa de sistemas legados bancários, médicos e empresariais.

O que é polimorfismo em Java?
Polimorfismo em Java Ocorre quando uma ou mais classes ou objetos estão relacionados entre si por herança. É a capacidade de um objeto assumir várias formas. A herança permite que os usuários herdem atributos e métodos, e o polimorfismo usa esses métodos para executar tarefas diferentes. O objetivo é a comunicação, embora a abordagem possa variar.
Por exemplo, um smartphone é usado para comunicação. O modo de comunicação pode ser uma chamada, uma mensagem de texto, uma mensagem com imagem ou um e-mail. O objetivo é comum, ou seja, a comunicação, mas a abordagem é diferente. Esse comportamento é a essência da comunicação. PolimorfismoAgora vamos aprender sobre polimorfismo em Java Com exemplos de código, diagramas e explicações passo a passo.
Clique aqui. se o vídeo não estiver acessível
Por que usar o polimorfismo em Java?
Polimorfismo em Java É utilizado porque torna o código flexível, reutilizável e mais fácil de manter. Uma única variável de referência de um tipo pai pode apontar para vários objetos filhos, de modo que a mesma chamada se adapta a qualquer subclasse fornecida. Esse padrão mantém o código testado intacto enquanto novos comportamentos são adicionados por meio de subclasses especializadas, e é exatamente por isso que frameworks como Spring e Jakarta EE dependem dele.
Java Polimorfismo em OOPs com exemplo
Considere uma classe pai chamada de Corretora Com funções para depósito e saque. A classe Conta possui duas classes filhas. A operação de depósito e saque é a mesma para contas Poupança e Conta Corrente, portanto os métodos herdados da classe Conta funcionarão.
Java Exemplo de polimorfismo
Mudança nos requisitos de software
Houve uma alteração na especificação de requisitos, algo comum na indústria de software. É necessário adicionar a funcionalidade para uma conta bancária privilegiada com limite de crédito. O limite de crédito permite que o cliente saque um valor superior ao saldo disponível na conta. O método de saque para a conta privilegiada precisa de uma nova implementação, enquanto o código testado nas contas de poupança e corrente permanece inalterado. Esse isolamento é a vantagem de... OOPS.
Passo 1) Quando o método de saque da conta poupança é chamado, o método definido na classe pai Account é executado.
Passo 2) Quando o método de saque para a conta privilegiada (cheque especial) é chamado, o método de saque definido na classe privilegiada é executado. Este despacho é Polimorfismo em POO.
Substituição de método em Java
Sobrescrita de métodos é o processo de redefinir um método da superclasse dentro de uma subclasse. A subclasse mantém o mesmo conteúdo.tract, mas fornece uma nova implementação que é selecionada quando o programa é executado.
Regras para substituição de método
- A assinatura do método, ou seja, o nome do método, a lista de parâmetros e o tipo de retorno, deve corresponder exatamente.
- O método sobrescrito pode ampliar a acessibilidade, mas não pode restringi-la. Se o método for privado na classe base, a classe filha pode torná-lo público, mas não o contrário.
Exemplo
class Doctor{ public void treatPatient(){ // treatPatient method } class Surgeon extends Doctor{ public void treatPatient(){ // treatPatient method } } class Run{ public static void main (String args[]){ Doctor doctorObj = new Doctor(); // treatPatient method in class Doctor will be executed doctorObj.treatPatient(); Surgeon surgeonObj = new Surgeon(); // treatPatient method in class Surgeon will be executed surgeonObj.treatPatient(); } }
Diferença entre sobrecarga de métodos e sobrescrita de métodos
A sobrecarga de métodos ocorre dentro da mesma classe, com o mesmo nome de método, mas com assinaturas diferentes. A sobrescrita de métodos ocorre em uma relação de classe pai-filho, onde a subclasse redefine um método declarado na superclasse.
| A sobrecarga de métodos ocorre na mesma classe, onde mais de um método possui o mesmo nome, mas assinaturas diferentes. | Sobrescrita de método ocorre quando um dos métodos da superclasse é redefinido na subclasse. Nesse caso, a assinatura do método permanece a mesma. |
Ex:
void sum (int a , int b); void sum (int a , int b, int c); void sum (float a, double b); |
Ex:
class X{ public int sum(){ // some code } } class Y extends X{ public int sum(){ //overridden method //signature is same } } |
O que é polimorfismo dinâmico?
O polimorfismo dinâmico em POO (Programação Orientada a Objetos) é o mecanismo pelo qual múltiplos métodos podem ser definidos com o mesmo nome e assinatura tanto na superclasse quanto na subclasse. A chamada a um método sobrescrito é resolvida em tempo de execução por meio de vinculação dinâmica dentro da JVM (Máquina Virtual Java).
Exemplo de polimorfismo dinâmico
Uma variável de referência da superclasse pode se referir a um objeto da subclasse:
Doctor obj = new Surgeon();
Considere a seguinte afirmação:
obj.treatPatient();
Aqui está a variável de referência vol é da classe pai, mas o objeto para o qual está apontando é da classe filha, como mostrado no diagrama de Polimorfismo.
A chamada obj.tratarPaciente() executará o método treatPatient() da subclasse Surgeon. Quando uma referência de classe base é usada para chamar um método, o método invocado é decidido pela JVM com base no objeto real para o qual a referência aponta. Mesmo que vol é uma referência a Doctor, que chama o método de Surgeon, pois aponta para um objeto Surgeon. A decisão é tomada em tempo de execução, por isso é chamada de Polimorfismo Dinâmico ou polimorfismo em tempo de execução.
Diferença entre polimorfismo estático e dinâmico
Polimorfismo Estático em Java O polimorfismo de compilação é um tipo de polimorfismo que coleta as informações para chamar um método em tempo de compilação, enquanto o polimorfismo dinâmico é um tipo de polimorfismo que coleta as informações para chamar um método em tempo de execução.
| Está relacionado à sobrecarga de métodos. | Isso se relaciona com a sobrescrita de métodos. |
| Os erros, se houver, são resolvidos em tempo de compilação. Como o código não é executado durante a compilação, o nome é estático.
Ex: void sum (int a , int b); void sum (float a, double b); int sum (int a, int b); //compiler gives error. |
Quando uma variável de referência chama um método sobrescrito, o método a ser invocado é determinado pelo objeto para o qual a variável de referência aponta. Isso só pode ser determinado em tempo de execução, quando o código está sendo executado, e é por isso que o nome é dinâmico.
Ex: //reference of parent pointing to child object Doctor obj = new Surgeon(); // method of child called obj.treatPatient(); |
Super palavra-chave em Java
E se o método `treatPatient` da classe `Surgeon` quiser executar a funcionalidade definida na classe `Doctor` e, em seguida, realizar seu próprio comportamento específico? Nesse caso, a palavra-chave super pode ser usado para acessar métodos da classe pai da classe filha. O método treatPatient na classe Surgeon poderia ser escrito como:
treatPatient(){
super.treatPatient();
//add code specific to Surgeon
}
A palavra-chave `super` pode ser usada para acessar qualquer membro de dados ou método da superclasse dentro da subclasse. A seguir, aprenderemos sobre a palavra-chave `super`. Herançae Polimorfismo em Java com programas de exemplo.
Exemplo: Para aprender sobre herança, polimorfismo e a palavra-chave `super`.
Passo 1) Copie o código a seguir em um editor.
public class Test{ public static void main(String args[]){ X x= new X(); Y y = new Y(); y.m2(); //x.m1(); //y.m1(); //x = y;// parent pointing to object of child //x.m1() ; //y.a=10; } } class X{ private int a; int b; public void m1(){ System.out.println("This is method m1 of class X"); } } class Y extends X{ int c; // new instance variable of class Y public void m1(){ // overridden method System.out.println("This is method m1 of class Y"); } public void m2(){ super.m1(); System.out.println("This is method m2 of class Y"); } }
Passo 2) Salve, compile e execute o código. Observe o resultado.
Passo 3) Remova o comentário das linhas 6 a 9. Salve, compile e execute o código. Observe a saída.
Passo 4) Remova o comentário da linha 10. Salve e compile o código.
Passo 5) Erro = ? Isso ocorre porque a subclasse não pode acessar membros privados da superclasse.





