¿Qué es el polimorfismo en Java?
El polimorfismo en Java ocurre cuando hay una o más clases u objetos relacionados entre sí por herencia. En otras palabras, es la capacidad de 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, tiene un teléfono inteligente para comunicarse. El modo de comunicación que elija puede ser cualquier cosa. Puede ser una llamada, un mensaje de texto, un mensaje de imagen, correo, etc. Entonces, el objetivo común es la comunicación, pero su enfoque es diferente. Esto se llama polimorfismo.
En este tutorial, aprenderá:
- ¿Qué es el polimorfismo?
- Polimorfismo de Java en OOP con ejemplo
- Anulación de método
- Diferencia entre sobrecarga y anulación
- ¿Qué es el polimorfismo dinámico?
- Súper palabra clave
- Diferencia entre polimorfismo estático y dinámico
Haga clic aquí si el video no es accesible
Polimorfismo de Java en OOP con ejemplo
Tenemos una clase para padres, 'Cuenta' con función de depósito y retiro. La cuenta tiene 2 clases secundarias. La operación de depósito y retiro es la misma para las cuentas de ahorro y de cheques. Entonces, los métodos heredados de la clase Account funcionarán.Cambio en el requisito de software
Hay un cambio en la especificación de requisitos, algo que es tan común en la industria del software. Se supone que debe agregar una cuenta bancaria con funcionalidad privilegiada con servicio de sobregiro.
Como antecedentes, el sobregiro es una facilidad en la que puede retirar una cantidad mayor que el saldo disponible en su cuenta.
Por lo tanto, el método de retiro para necesidades privilegiadas se implementará de nuevo. Pero no cambia el código probado en la cuenta de ahorros y de cheques. Esta es la ventaja de OOPS
Paso 1) De tal manera 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 el método "Retirar" para la cuenta privilegiada (servicio de sobregiro) se llama, se ejecuta el método de retiro definido en la clase privilegiada. Este es el polimorfismo.
Anulación de método
Method Overriding es redefinir un método de superclase en una subclase.
Reglas para la anulación de 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 executeddoctorObj.treatPatient();Surgeon surgeonObj = new Surgeon();// treatPatient method in class Surgeon will be executedsurgeonObj.treatPatient();}}
Diferencia entre sobrecarga y anulación
Sobrecarga de métodos | Anulación de método |
---|---|
La sobrecarga de métodos pertenece a la misma clase, donde más de un método tienen el mismo nombre pero firmas diferentes. |
La anulación de método es 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. |
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}} |
¿Qué es el polimorfismo dinámico?
El polimorfismo dinámico es el mecanismo por 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 diagrama).
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á, según el objeto al que apunta la referencia
Por ejemplo, aunque obj es una referencia a Doctor, llama al método Surgeon, ya que apunta a un objeto Surgeon
Esto se decide durante el tiempo de ejecución y, por lo tanto, se denomina polimorfismo dinámico o en tiempo de ejecución.
Súper palabra clave
¿Qué pasa si el método treatPatient en la clase Surgeon quiere ejecutar la funcionalidad definida en la clase Doctor y luego realizar su propia funcionalidad específica?
En este caso, palabra clave
super
se puede utilizar para acceder a los métodos de la clase principal desde la clase secundaria.El método treatPatient en la clase Surgeon 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étodos de la superclase en la subclase.Ejemplo: -Para aprender herencia, polimorfismo y super palabra 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 Ypublic void m1(){// overriden methodSystem.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. Observa la salida.
Paso 3) Descomenta las líneas # 6-9. Guarde, compile y ejecute el código. Observa la salida.
Paso 4) Descomente 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.
Diferencia entre polimorfismo estático y dinámico
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 static. Ex: 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á lo determina 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. Ex: //reference of parent pointing to child objectDoctor obj = new Surgeon();// method of child calledobj.treatPatient(); |