Introducción al polimorfismo de tiempo de ejecución en Java

En este artículo, vamos a aprender sobre el polimorfismo de tiempo de ejecución en Java. "Poli" significa "muchos" y "morph" significa "tipo". Entonces, el término polimorfismo indica lo mismo de diferentes tipos. Aquí veremos cómo Java archiva el polimorfismo en tiempo de ejecución, lo que significa, después de la compilación pero antes de ejecutar el código.

Sintaxis:

Para el polimorfismo de tiempo de ejecución en Java, debe seguir la sintaxis básica de Java con anotaciones. @Override anotación @Override se puede usar aquí para señalar específicamente qué método queremos anular.

¿Cómo funciona el polimorfismo de tiempo de ejecución en Java?

El polimorfismo de tiempo de ejecución funciona en Java mediante la anulación de métodos. La anulación de métodos ocurre cuando los objetos tienen el mismo nombre y argumentos y tipo de método que su clase principal pero con una funcionalidad diferente. Si una clase secundaria tiene ese tipo de método, la llamamos un método anulado.

¿Por qué se llama Polimorfismo de tiempo de ejecución?

cuando llamamos a un método de clase secundaria anulado a través de su referencia de tipo padre (este fenómeno en java se conoce como "Upcasting"), entonces el tipo de objeto indica qué método o funcionalidad se invocará. JVM toma esta decisión durante el tiempo de ejecución después de la compilación del código. Por lo tanto, se llama polimorfismo en tiempo de ejecución.

También se conoce como "Despacho de método dinámico". La razón se llama así, debido a que JVM decide dinámicamente la funcionalidad del método en tiempo de ejecución según el objeto

También se llama "Enlace tardío", porque el enlace del método y el objeto, lo que significa que la funcionalidad de qué método del objeto se mostrará, se decide tarde, es decir, después de la compilación.

Reglas y limitaciones en Runtim e Polymorphism

A continuación se presentan algunas de las reglas y limitaciones del polimorfismo de tiempo de ejecución:

Reglas del polimorfismo de tiempo de ejecución

  • Los métodos de clase secundaria y principal deben tener el mismo nombre.
  • Los métodos de clase secundaria y principal deben tener el mismo parámetro.
  • La relación IS-A es obligatoria (herencia).

Limitaciones del polimorfismo de tiempo de ejecución

  • No se pueden anular los métodos privados de una clase primaria.
  • Uno no puede anular los métodos finales.
  • Uno no puede anular los métodos estáticos.

Ejemplos de polimorfismo de tiempo de ejecución en Java

Discutiremos algunos ejemplos de código del polimorfismo en tiempo de ejecución aquí.

Ejemplo 1

En este ejemplo, mostraremos cómo el método showcase () muestra diferentes mensajes según el tipo de objeto al que está asociado. Cuando está asociado con el tipo "Padres", muestra mensajes de la clase padre. Mientras que, cuando está asociado con el tipo "Hijos", muestra mensajes de la clase secundaria.

Código:

class Parents (
public void showcase () (
System.out.println("I am Parent");
)
)
class Children extends Parents (
@Override
public void showcase () (
System.out.println("I am Children");
)
)
public class RunTimePolymorphism (
public static void main(String args()) (
Parents superObject = new Parents();
superObject.showcase(); //method of super class or parent class is called
Parents subObject = new Children(); // upcasting
subObject.showcase();//method of sub class or child class is called by Parent reference, this is called "Run time Polymorphism"
Children subObject2 = new Children();
subObject2.showcase(); //method of sub class or child class is called
)
)

Salida:

Ejemplo # 2

Tomemos un ejemplo de polimorfismo en tiempo de ejecución en caso de herencia multinivel. En este ejemplo, hemos tenido en cuenta dos niveles de herencia. En este ejemplo, mostraremos cómo el método sip () muestra diferentes mensajes según el tipo de objeto al que está asociado. Cuando se asocia con el tipo "Humano", muestra mensajes de una clase principal. Mientras que, cuando está asociado con el tipo "Hombre", muestra mensajes de su clase secundaria. Nuevamente en el segundo nivel de herencia, cuando está asociado con el tipo "Bebé", muestra mensajes de su clase hija de su padre, que es la clase "Hombre".

Código:

class Human(
void sip() (
System.out.println("Human is sipping");
)
)
class Man extends Human(
void sip()(
System.out.println("Man is sipping soup");
)
)
class Baby extends Man(
void sip()(
System.out.println("Baby is sipping milk");
)
)
public class RunTimePolymorphism (
public static void main(String args())(
Human superObject=new Human();
Human subObject=new Man(); // // upcasting : first level of heritance
Human babyObject=new Baby(); // // upcasting : second level of heritance
superObject.sip();
subObject.sip(); //run time polymorphism happening in first level of heritance
babyObject.sip(); //run time polymorphism happening in second level of heritance
)
)

Salida:

Ejemplo # 3

Tomemos otro ejemplo de polimorfismo en tiempo de ejecución en caso de herencia multinivel. En este ejemplo tenemos tres niveles de herencia que se tienen en cuenta. En este ejemplo, mostraremos cómo la función del método () muestra diferentes funciones según el tipo de objeto con el que está asociada. Cuando está asociado con el tipo de "sistema operativo", muestra mensajes de una clase principal. Mientras que, cuando está asociado con el tipo "DOS", muestra mensajes de su clase secundaria. Nuevamente en el segundo nivel de herencia, cuando está asociado con el tipo "Windows", muestra mensajes de su clase secundaria de su clase primaria, que es la clase "DOS". Nuevamente en el tercer nivel de herencia, cuando está asociado con el tipo "WindowsMobile", muestra mensajes de su clase secundaria de su clase primaria que es la clase "Windows".

Código:

class OperatingSytem(
void feature() (
System.out.println("This is Operating Sytem");
)
)
class DOS extends OperatingSytem(
void feature()(
System.out.println("This is DOS");
)
)
class Windows extends DOS(
void feature()(
System.out.println("This is Windows");
)
)
class WindowsMobile extends Windows(
void feature()(
System.out.println("This is Windows Mobile");
)
)
public class RunTimePolymorphism (
public static void main(String args())(
OperatingSytem superObject=new OperatingSytem();
OperatingSytem subObject=new DOS(); // child object type : first level of heritance
OperatingSytem sub2Object=new Windows(); // child object type : second level of heritance
OperatingSytem sub3Object=new WindowsMobile(); // child object type : third level of heritance
superObject.feature();
subObject.feature(); //run time polymorphism happening in first level of heritance
sub2Object.feature(); //run time polymorphism happening in second level of heritance
sub3Object.feature(); //run time polymorphism happening in third level of heritance
)
)

Salida:

Conclusión

Esto concluye nuestro aprendizaje del tema "Polimorfismo de tiempo de ejecución en Java". Escríbete los códigos mencionados en los ejemplos anteriores en el compilador de Java y verifica la salida. El aprendizaje de códigos será incompleto si no escribe el código usted mismo.

Artículos recomendados

Esta ha sido una guía para el polimorfismo de tiempo de ejecución en Java. Aquí discutimos cómo funciona el polimorfismo de tiempo de ejecución en Java con ejemplos. También puede echar un vistazo a los siguientes artículos para obtener más información:

  1. Palabra clave estática en Java
  2. Anulación en Java
  3. ¿Qué es el polimorfismo?
  4. Rust vs Golang