En el último tutorial discutimos el polimorfismo en Java. En esta guía veremos tipos de polimorfismo. Hay dos tipos de polimorfismo en java:
1) Polimorfismo estático también conocido como polimorfismo en tiempo de compilación
2) Polimorfismo dinámico también conocido como polimorfismo en tiempo de ejecución
Polimorfismo en tiempo de compilación (o polimorfismo estático)
El polimorfismo que se resuelve durante el tiempo del compilador se conoce como polimorfismo estático. La sobrecarga de métodos es un ejemplo de polimorfismo en tiempo de compilación.
Sobrecarga de métodos: Esto nos permite tener más de un método con el mismo nombre, si los parámetros de los métodos son diferentes en número, secuencia y tipos de datos de parámetros. Ya hemos discutido la sobrecarga de métodos aquí: Si no leyó esa guía, consulte: Sobrecarga de métodos en Java
Ejemplo de polimorfismo estático
La sobrecarga de métodos es una de las formas en que java admite el polimorfismo estático. Aquí tenemos dos definiciones del mismo método add () al que se llamaría el método add está determinado por la lista de parámetros en el momento de la compilación. Esa es la razón por la que también se conoce como polimorfismo en tiempo de compilación.
class SimpleCalculator{ int add(int a, int b) { return a+b; } int add(int a, int b, int c) { return a+b+c; }}public class Demo{ public static void main(String args) { SimpleCalculator obj = new SimpleCalculator(); System.out.println(obj.add(10, 20)); System.out.println(obj.add(10, 20, 30)); }}
Salida:
3060
Polimorfismo en tiempo de ejecución (o polimorfismo dinámico)
También se conoce como Envío de método Dinámico. El polimorfismo dinámico es un proceso en el que una llamada a un método anulado se resuelve en tiempo de ejecución, por eso se llama polimorfismo en tiempo de ejecución. Ya he comentado método primordial en detalle en otro tutorial, consultar: Método Primordial en Java.
Ejemplo
En este ejemplo tenemos dos clases ABC y XYZ. ABC es una clase para padres y XYZ es una clase para hijos. La clase hija está sobreescribiendo el método myMethod() de la clase padre. En este ejemplo, tenemos un objeto de clase hijo asignado a la referencia de clase padre, por lo que para determinar a qué método se llamaría, el tipo del objeto se determinaría en tiempo de ejecución. Es el tipo de objeto el que determina a qué versión del método se llamará (no el tipo de referencia).
Para entender el concepto de sobreescritura, debe tener los conocimientos básicos de herencia en Java.
class ABC{ public void myMethod(){System.out.println("Overridden Method"); }}public class XYZ extends ABC{ public void myMethod(){System.out.println("Overriding Method"); } public static void main(String args){ABC obj = new XYZ();obj.myMethod(); }}
Salida:
Overriding Method
Cuando se llama a un método sobreescrito a través de una referencia de clase padre, el tipo del objeto determina qué método se va a ejecutar. Por lo tanto, esta determinación se realiza en tiempo de ejecución.
Dado que ambas clases, la clase hija y la clase padre tienen el mismo método animalSound
. La versión del método(clase hija o clase padre) a la que se llamará se determina en tiempo de ejecución por JVM.
Algunos ejemplos más de sobreescritura:
ABC obj = new ABC();obj.myMethod();// This would call the myMethod() of parent class ABCXYZ obj = new XYZ();obj.myMethod();// This would call the myMethod() of child class XYZABC obj = new XYZ();obj.myMethod();// This would call the myMethod() of child class XYZ
En el tercer caso, el método de la clase hija se va a ejecutar porque el método que se va a ejecutar está determinado por el tipo de objeto y como el objeto pertenece a la clase hija, se llama a la versión de la clase hija de myMethod ().