Polimorfismo en programación orientada a objetos de Java con ejemplo: qué es dinámico

¿Qué es el polimorfismo en Java?

Polimorfismo en Java ocurre cuando hay una o más clases u objetos relacionados entre sí por herencia. Es la capacidad que tiene un objeto de adoptar muchas formas. La herencia permite a los usuarios heredar atributos y métodos, y el polimorfismo utiliza estos métodos para realizar diferentes tareas. Entonces, el objetivo es la comunicación, pero el enfoque es diferente.

Por ejemplo, tienes un teléfono inteligente para comunicarte. El modo de comunicación que elijas puede ser cualquier cosa. Puede ser una llamada, un mensaje de texto, un mensaje con imagen, mail, etc. Entonces, el objetivo es común, es decir, la comunicación, pero su enfoque es diferente. Se llama Polimorfismo. Ahora aprenderemos el polimorfismo en Java con un ejemplo.

En este Tutorial de Java, aprenderás-




Haga clic aquí si el video no es accesible

Polimorfismo de Java en programación orientada a objetos con ejemplo

Tenemos una clase principal, 'Cuenta' con función de depósito y retiro. La cuenta tiene 2 clases infantiles.

La operación de depósito y retiro es la misma para cuentas corrientes y de ahorro. Entonces los métodos heredados de la clase Cuenta funcionarán.

Herencia única en Java
Ejemplo de polimorfismo de Java

Cambio en el requisito de software

Hay un cambio en la especificación de requisitos, algo muy común en la industria del software. Se supone que debe agregar la funcionalidad de cuenta bancaria privilegiada con servicio de sobregiro.

A modo de ejemplo, el sobregiro es un servicio en el que puede retirar una cantidad superior al saldo disponible en su cuenta.

Por lo tanto, el método de retiro para necesidades privilegiadas debe implementarse de nuevo. Pero no cambia el código probado en la cuenta corriente y de ahorros. Esta es la ventaja de OOPS

Polimorfismo de Java

Paso 1) De modo que cuando se llama al método "retirado" para la cuenta de ahorro, se ejecuta un método de la clase de cuenta principal

Polimorfismo de Java

Paso 2) Pero cuando se llama al método de “Retiro” para la cuenta privilegiada (servicio de sobregiro), se ejecuta el método de retiro definido en la clase privilegiada. Esto es Polimorfismo en OOP.

Polimorfismo de Java

Anulación de métodos en Java

La anulación de métodos consiste en redefinir un método de superclase en una subclase.

Reglas para anular métodos

  • La firma del método, es decir, el nombre del método, la lista de parámetros y el tipo de retorno, deben coincidir exactamente.
  • El método anulado puede ampliar la accesibilidad pero no limitarla, es decir, si es privado en la clase base, la clase secundaria puede hacerlo público pero no al revés.

Reglas para la anulación de métodos en Java

Ejemplo

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();
  }
}

Diferencia entre sobrecarga y anulación

Sobrecarga de métodos
Anulación de método
La sobrecarga de métodos ocurre en la misma clase, donde más de un método tiene el mismo nombre pero firmas diferentes. La anulación de métodos se produce cuando uno de los métodos de la superclase se redefine en la subclase. En este caso, la firma del método sigue siendo la misma.
por ejemplo:

void sum (int a , int b);
void sum (int a , int b, int c);
void sum (float a, double b);
por ejemplo:

class X{
  public int sum(){
     // some code
  }
}
class Y extends X{
  public int sum(){
    //overridden method
   //signature is same
 }
}

¿Qué es el polimorfismo dinámico?

El polimorfismo dinámico en POO es el mecanismo mediante el cual se pueden definir múltiples métodos con el mismo nombre y firma en la superclase y subclase. La llamada a un método anulado se resuelve en tiempo de ejecución.

Ejemplo de polimorfismo dinámico:

Una variable de referencia de la superclase puede hacer referencia a un objeto de subclase.

 Doctor obj = new Surgeon();

Considere la declaración

obj.treatPatient();

Aquí la variable de referencia "obj" es de la clase principal, pero el objeto al que apunta es de la clase secundaria (como se muestra en el siguiente diagrama de ejemplo de polimorfismo).

obj.treatPatient() ejecutará el método TreatPatient() de la subclase – Cirujano

Si se utiliza una referencia de clase base para llamar a un método, la JVM decide el método que se invocará, dependiendo del objeto al que apunte la referencia.

Por ejemplo, aunque obj es una referencia a Doctor, llama al método de Cirujano, ya que apunta a un objeto Cirujano.

Esto se decide durante el tiempo de ejecución y, por lo tanto, se denomina lugar de trabajo dinámico or polimorfismo en tiempo de ejecución

Diferencia entre polimorfismo estático y dinámico

Polimorfismo estático en Java es un tipo de polimorfismo que recopila la información para llamar a un método en tiempo de compilación, mientras que el polimorfismo dinámico es un tipo de polimorfismo que recopila la información para llamar a un método en tiempo de ejecución.

Polimorfismo estático
Polimorfismo dinámico
Se relaciona con la sobrecarga de métodos. Se relaciona con la anulación de métodos.
Los errores, si los hay, se resuelven en tiempo de compilación. Dado que el código no se ejecuta durante la compilación, de ahí el nombre estático.

por ejemplo:

void sum (int a , int b);
void sum (float a, double b);
int sum (int a, int b); //compiler gives error.

En caso de que una variable de referencia llame a un método anulado, el método que se invocará está determinado por el objeto al que apunta la variable de referencia. Esto solo se puede determinar en tiempo de ejecución cuando el código está en ejecución, de ahí el nombre dinámico.

por ejemplo:

//reference of parent pointing to child object
 Doctor obj = new Surgeon();
// method of child called
obj.treatPatient();

Súper palabra clave en Java

¿Qué pasa si el método TreatPatient en la clase Cirujano quiere ejecutar la funcionalidad definida en la clase Doctor y luego realizar su propia funcionalidad específica?

En este caso, palabra clave superse puede utilizar para acceder a métodos de la clase principal desde la clase secundaria.

El método TreatPatient en la clase Cirujano podría escribirse como:

treatPatient(){
   super.treatPatient();
     //add code specific to Surgeon
}

La palabra clave super se puede utilizar para acceder a cualquier miembro de datos o método de la superclase en la subclase.

A continuación, aprenderemos sobre la súper palabra clave. Herencia y Polimorfismo en Java con programas de ejemplo.

Ejemplo: -Para aprender herencia, polimorfismo y súper palabras clave

Paso 1) copia el siguientewing código en un 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");
      }
}

Paso 2) Guarde, compile y ejecute el código. Observe la salida.

Paso 3) Descomente las líneas # 6-9. Guarde, compile y ejecute el código. Observe la salida.

Paso 4) Descomentar la línea #10. Guarde y compile el código.

Paso 5) Error=? Esto se debe a que la subclase no puede acceder a miembros privados de la superclase.

Resumen

  • El polimorfismo en la Programación Orientada a Objetos ocurre cuando hay una o más clases u objetos relacionados entre sí por herencia. Es la capacidad que tiene un objeto de adoptar muchas formas.
  • La anulación de métodos consiste en redefinir un método de superclase en una subclase.
  • El polimorfismo dinámico en Java es el mecanismo mediante el cual se pueden definir múltiples métodos con el mismo nombre y firma en la superclase y subclase.
  • El polimorfismo estático en Java es un tipo de polimorfismo que recopila la información para llamar a un método en tiempo de compilación, mientras que el polimorfismo dinámico es un tipo de polimorfismo que recopila la información para llamar a un método en tiempo de ejecución.
  • súper keyword se puede utilizar para acceder a métodos de la clase principal desde la clase secundaria.