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.

Herança única em Java
Java Exemplo de polimorfismo

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

Java Polimorfismo

Passo 1) Tal que quando o método “retirado” para conta poupança é chamado, um método da classe da conta pai é executado

Java Polimorfismo

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.

Java Polimorfismo

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.

Regras para substituição de método em Java

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

Sobrecarga de método
Substituição de método
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.

Polimorfismo Estático
Polimorfismo Dinâmico
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.

Resuma esta postagem com: