logo

Polimorfismo en Java

Polimorfismo en Java es un concepto mediante el cual podemos realizar una acción única de diferentes maneras . El polimorfismo se deriva de dos palabras griegas: poli y morfos. La palabra 'poli' significa muchos y 'morfos' significa formas. Entonces polimorfismo significa muchas formas.

Hay dos tipos de polimorfismo en Java: polimorfismo en tiempo de compilación y polimorfismo en tiempo de ejecución. Podemos realizar polimorfismo en Java mediante la sobrecarga de métodos y la anulación de métodos.

Si sobrecarga un método estático en Java, es el ejemplo de polimorfismo en tiempo de compilación. Aquí, nos centraremos en el polimorfismo en tiempo de ejecución en Java.


Polimorfismo en tiempo de ejecución en Java

Polimorfismo en tiempo de ejecución o Envío de método dinámico es un proceso en el que una llamada a un método anulado se resuelve en tiempo de ejecución en lugar de en tiempo de compilación.

En este proceso, se llama a un método anulado a través de la variable de referencia de una superclase. La determinación del método a llamar se basa en el objeto al que hace referencia la variable de referencia.

es igual al método java

Primero comprendamos la actualización antes del polimorfismo en tiempo de ejecución.

Upcasting

Si la variable de referencia de la clase principal se refiere al objeto de la clase secundaria, se conoce como conversión ascendente. Por ejemplo:

Actualización en Java
 class A{} class B extends A{} 
 A a=new B();//upcasting 

Para la actualización, podemos usar la variable de referencia del tipo de clase o un tipo de interfaz. Por ejemplo:

 interface I{} class A{} class B extends A implements I{} 

Aquí, la relación de clase B sería:

 B IS-A A B IS-A I B IS-A Object 

Dado que Object es la clase raíz de todas las clases en Java, podemos escribir B IS-A Object.


Ejemplo de polimorfismo en tiempo de ejecución de Java

En este ejemplo, estamos creando dos clases Bike y Splendor. La clase Splendor extiende la clase Bike y anula su método run(). Llamamos al método de ejecución mediante la variable de referencia de la clase principal. Dado que se refiere al objeto de la subclase y el método de la subclase anula el método de la clase principal, el método de la subclase se invoca en tiempo de ejecución.

Dado que la invocación del método está determinada por la JVM y no por el compilador, se conoce como polimorfismo en tiempo de ejecución.

 class Bike{ void run(){System.out.println('running');} } class Splendor extends Bike{ void run(){System.out.println('running safely with 60km');} public static void main(String args[]){ Bike b = new Splendor();//upcasting b.run(); } } 
Pruébalo ahora

Producción:

 running safely with 60km. 

Ejemplo de polimorfismo en tiempo de ejecución de Java: banco

Considere un escenario en el que Banco es una clase que proporciona un método para obtener la tasa de interés. Sin embargo, la tasa de interés puede variar según los bancos. Por ejemplo, los bancos SBI, ICICI y AXIS ofrecen tipos de interés del 8,4%, 7,3% y 9,7%.

Ejemplo de banco de polimorfismo en tiempo de ejecución de Java

Nota: Este ejemplo también se proporciona en la anulación de métodos, pero no hubo conversión ascendente.

 class Bank{ float getRateOfInterest(){return 0;} } class SBI extends Bank{ float getRateOfInterest(){return 8.4f;} } class ICICI extends Bank{ float getRateOfInterest(){return 7.3f;} } class AXIS extends Bank{ float getRateOfInterest(){return 9.7f;} } class TestPolymorphism{ public static void main(String args[]){ Bank b; b=new SBI(); System.out.println('SBI Rate of Interest: '+b.getRateOfInterest()); b=new ICICI(); System.out.println('ICICI Rate of Interest: '+b.getRateOfInterest()); b=new AXIS(); System.out.println('AXIS Rate of Interest: '+b.getRateOfInterest()); } } 
Pruébalo ahora

Producción:

 SBI Rate of Interest: 8.4 ICICI Rate of Interest: 7.3 AXIS Rate of Interest: 9.7 

Ejemplo de polimorfismo en tiempo de ejecución de Java: forma

 class Shape{ void draw(){System.out.println('drawing...');} } class Rectangle extends Shape{ void draw(){System.out.println('drawing rectangle...');} } class Circle extends Shape{ void draw(){System.out.println('drawing circle...');} } class Triangle extends Shape{ void draw(){System.out.println('drawing triangle...');} } class TestPolymorphism2{ public static void main(String args[]){ Shape s; s=new Rectangle(); s.draw(); s=new Circle(); s.draw(); s=new Triangle(); s.draw(); } } 
Pruébalo ahora

Producción:

 drawing rectangle... drawing circle... drawing triangle... 

Ejemplo de polimorfismo en tiempo de ejecución de Java: animal

 class Animal{ void eat(){System.out.println('eating...');} } class Dog extends Animal{ void eat(){System.out.println('eating bread...');} } class Cat extends Animal{ void eat(){System.out.println('eating rat...');} } class Lion extends Animal{ void eat(){System.out.println('eating meat...');} } class TestPolymorphism3{ public static void main(String[] args){ Animal a; a=new Dog(); a.eat(); a=new Cat(); a.eat(); a=new Lion(); a.eat(); }} 
Pruébalo ahora

Producción:

 eating bread... eating rat... eating meat... 

Polimorfismo en tiempo de ejecución de Java con miembro de datos

Se anula un método, no los miembros de datos, por lo que los miembros de datos no pueden lograr el polimorfismo en tiempo de ejecución.

En el ejemplo que se muestra a continuación, ambas clases tienen un límite de velocidad de miembro de datos. Accedemos al miembro de datos mediante la variable de referencia de la clase principal que se refiere al objeto de la subclase. Dado que estamos accediendo al miembro de datos que no se anula, siempre accederá al miembro de datos de la clase principal.

matemáticas.pow java

Regla: los miembros de datos no pueden lograr el polimorfismo en tiempo de ejecución.

 class Bike{ int speedlimit=90; } class Honda3 extends Bike{ int speedlimit=150; public static void main(String args[]){ Bike obj=new Honda3(); System.out.println(obj.speedlimit);//90 } } 
Pruébalo ahora

Producción:

 90 

Polimorfismo en tiempo de ejecución de Java con herencia multinivel

Veamos el ejemplo sencillo de polimorfismo en tiempo de ejecución con herencia multinivel.

 class Animal{ void eat(){System.out.println('eating');} } class Dog extends Animal{ void eat(){System.out.println('eating fruits');} } class BabyDog extends Dog{ void eat(){System.out.println('drinking milk');} public static void main(String args[]){ Animal a1,a2,a3; a1=new Animal(); a2=new Dog(); a3=new BabyDog(); a1.eat(); a2.eat(); a3.eat(); } } 
Pruébalo ahora

Producción:

 eating eating fruits drinking Milk 

Pruebe la salida

 class Animal{ void eat(){System.out.println('animal is eating...');} } class Dog extends Animal{ void eat(){System.out.println('dog is eating...');} } class BabyDog1 extends Dog{ public static void main(String args[]){ Animal a=new BabyDog1(); a.eat(); }} 
Pruébalo ahora

Producción:

 Dog is eating 

Dado que BabyDog no anula el método eat(), se invoca el método eat() de la clase Dog.