Polimorfismo em Java (Estático e Dinâmico)
O que é polimorfismo em Java?
Polimorfismo in Java ocorre quando há uma ou mais classes ou objetos relacionados entre si por herança. É a capacidade de um objeto assumir muitas formas. A herança permite que os usuários herdem atributos e métodos, e o polimorfismo usa esses métodos para realizar diferentes tarefas. Então, o objetivo é a comunicação, mas a abordagem é diferente.
Por exemplo, você tem um smartphone para comunicação. O modo de comunicação que você escolher pode ser qualquer um. Pode ser uma ligação, uma mensagem de texto, uma mensagem multimídia, um e-mail, etc. Então, o objetivo é comum que é a comunicação, mas a abordagem é diferente. Isso é chamado Polimorfismo. Agora, aprenderemos Polimorfismo em Java com exemplo.
Clique aqui se o vídeo não estiver acessível
Java Polimorfismo em OOPs com exemplo
Temos uma classe pai, 'Account' com função de depósito e retirada. Account tem 2 classes filhas. A operação de depósito e retirada é a mesma para contas Saving e Checking. Então os métodos herdados da classe Account funcionarão.

Mudança nos requisitos de software
Há uma mudança na especificação de requisitos, algo que é tão comum na indústria de software. Você deve adicionar a funcionalidade Conta bancária privilegiada com facilidade de cheque especial. Para um histórico, o cheque especial é uma facilidade onde você pode sacar um valor maior do que o saldo disponível em sua conta. Então, o método de saque para necessidades privilegiadas precisa ser implementado novamente. Mas você não altera o pedaço de código testado em Conta poupança e conta corrente. Esta é a vantagem de OOPS
Passo 1) Tal que quando o método “retirado” para conta poupança é chamado, um método da classe da conta pai é executado
Passo 2) Mas quando o método “Saque” para a conta privilegiada (facilidade de cheque especial) é chamado, o método de saque definido na classe privilegiada é executado. Isso é Polimorfismo em OOPs.
Substituição de método em Java
Substituição de método é redefinir um método de superclasse em uma subclasse.
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 devem corresponder exatamente.
- O método substituído pode ampliar a acessibilidade, mas não restringi-la, ou seja, se for privado na classe base, a classe filha poderá torná-lo público, mas não vice-versa.
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 e substituição
| A sobrecarga de métodos ocorre na mesma classe, onde mais de um método possui o mesmo nome, mas assinaturas diferentes. | A substituição de método ocorre quando um dos métodos da superclasse é redefinido na subclasse. Neste 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?
Polimorfismo Dinâmico em OOPs é o mecanismo pelo qual vários métodos podem ser definidos com o mesmo nome e assinatura na superclasse e subclasse. A chamada para um método substituído é resolvida em tempo de execução.
Exemplo de polimorfismo dinâmico:
Uma variável de referência da superclasse pode se referir a um objeto de subclasse
Doctor obj = new Surgeon();
Considere a declaração
obj.treatPatient();
Aqui, a variável de referência “obj” é da classe pai, mas o objeto para o qual ela está apontando é da classe filha (como mostrado no exemplo do diagrama de polimorfismo abaixo).
obj.treatPatient() executará o método treatPatient() da subclasse – Cirurgião
Se uma referência de classe base for usada para chamar um método, o método a ser invocado será decidido pela JVM, dependendo do objeto para o qual a referência está apontando
Por exemplo, mesmo que obj seja uma referência a Doctor, ele chama o método de Surgeon, pois aponta para um objeto Surgeon
Isso é decidido durante o tempo de execução e, portanto, denominado dinâmico or polimorfismo em tempo de execução
Diferença entre polimorfismo estático e dinâmico
Polimorfismo Estático em Java é 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.
| Relaciona-se à sobrecarga de método. | Relaciona-se à substituição de método. |
| Erros, se houver, são resolvidos em tempo de compilação. Como o código não é executado durante a compilação, daí 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. |
Caso uma variável de referência esteja chamando um método substituído, o método a ser invocado é determinado pelo objeto para o qual sua variável de referência está apontando. Isso só pode ser determinado em tempo de execução quando o código está em execução, daí 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 na classe Surgeon quiser executar a funcionalidade definida na classe Doctor e então executar sua própria funcionalidade específica? Neste caso, a palavra-chave superpode 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étodos da superclasse na subclasse.
A seguir, aprenderemos sobre a palavra-chave Super, Herança e Polimorfismo em Java com programas de exemplo.
Exemplo: -Para aprender herança, polimorfismo e super palavra-chave
Passo 1) Copie o seguinte código 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(){
// overriden 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 a saída.
Passo 3) Remova os comentários das linhas 6-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.
Resumo
- O polimorfismo na Programação Orientada a Objetos ocorre quando há uma ou mais classes ou objetos relacionados entre si por herança. É a capacidade de um objeto assumir muitas formas.
- Substituição de método é redefinir um método de superclasse em uma subclasse.
- Polimorfismo Dinâmico em Java é o mecanismo pelo qual vários métodos podem ser definidos com o mesmo nome e assinatura na superclasse e subclasse.
- Polimorfismo Estático em Java é 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.
- A palavra-chave super pode ser usada para acessar métodos da classe pai a partir da classe filha.




