Polimorfismo en Java (Estático y dinámico)
¿Qué es el polimorfismo en Java?
Polimorfismo in Java Ocurre cuando existen 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: una llamada, un mensaje de texto, un mensaje con imagen, un correo, etc. Por lo tanto, el objetivo es común, es decir, la comunicación, pero su enfoque es diferente. Esto se llama Polimorfismo. Ahora, aprenderemos polimorfismo en Java con ejemplo.
Haga clic aquí si el video no es accesible
Java Polimorfismo en programación orientada a objetos con ejemplo
Tenemos una clase principal, "Cuenta", con funciones de depósito y retiro. La cuenta tiene dos clases secundarias. La operación de depósito y retiro es la misma para las cuentas de ahorro y corriente. Por lo tanto, los métodos heredados de la clase Cuenta funcionarán.
Cambio en el requisito de software
Hay un cambio en la especificación de requisitos, algo que es muy común en la industria del software. Se supone que debe agregar la funcionalidad Cuenta bancaria privilegiada con facilidad de sobregiro. Para tener un contexto, el sobregiro es una facilidad donde puede retirar una cantidad mayor que el saldo disponible en su cuenta. Por lo tanto, el método de retiro para cuentas privilegiadas debe implementarse nuevamente. Pero no cambia el fragmento de código probado en la cuenta de ahorros y corriente. Esta es la ventaja de OOPS
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
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.
Anulación de método 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.
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
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.
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é sucede si el método treatPatient de la clase Surgeon desea ejecutar la funcionalidad definida en la clase Doctor y luego realizar su propia funcionalidad específica? En este caso, la palabra clave super
Se puede utilizar para acceder a los métodos de la clase padre desde la clase hija. El método tratarPaciente de la clase Cirujano se podría escribir de la siguiente manera:
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) Copie el siguiente 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.
- 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.
- 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.
- La palabra clave super se puede utilizar para acceder a los métodos de la clase principal desde la clase secundaria.