logo

Polimorfisme a Java

Polimorfisme a Java és un concepte pel qual podem realitzar a acció única de diferents maneres . El polimorfisme es deriva de 2 paraules gregues: poli i morphs. La paraula 'poli' significa molts i 'morphs' significa formes. Per tant, polimorfisme significa moltes formes.

Hi ha dos tipus de polimorfisme a Java: el polimorfisme en temps de compilació i el polimorfisme en temps d'execució. Podem realitzar polimorfisme a Java mitjançant la sobrecàrrega de mètodes i la substitució de mètodes.

Si sobrecarregueu un mètode estàtic a Java, és l'exemple de polimorfisme en temps de compilació. Aquí, ens centrarem en el polimorfisme en temps d'execució a Java.


Polimorfisme en temps d'execució a Java

Polimorfisme en temps d'execució o Enviament del mètode dinàmic és un procés en què una trucada a un mètode anul·lat es resol en temps d'execució en lloc de compilació.

En aquest procés, es crida un mètode anul·lat mitjançant la variable de referència d'una superclasse. La determinació del mètode a cridar es basa en l'objecte al qual fa referència la variable de referència.

Primer entenem el upcasting abans del polimorfisme en temps d'execució.

com executar l'script a linux

Upcasting

Si la variable de referència de la classe Parent fa referència a l'objecte de la classe Fill, es coneix com a upcasting. Per exemple:

Upcasting a Java
 class A{} class B extends A{} 
 A a=new B();//upcasting 

Per a l'upcasting, podem utilitzar la variable de referència del tipus de classe o un tipus d'interfície. Per exemple:

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

Aquí, la relació de la classe B seria:

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

Com que Object és la classe arrel de totes les classes a Java, podem escriure B IS-A Object.


Exemple de polimorfisme en temps d'execució de Java

En aquest exemple, estem creant dues classes Bike i Splendor. La classe Splendor amplia la classe Bike i anul·la el seu mètode run(). Estem cridant al mètode d'execució mitjançant la variable de referència de la classe Parent. Com que fa referència a l'objecte de la subclasse i el mètode de la subclasse anul·la el mètode de la classe Parent, el mètode de la subclasse s'invoca en temps d'execució.

Com que la invocació del mètode la determina la JVM no el compilador, es coneix com a polimorfisme en temps d'execució.

 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(); } } 
Prova-ho ara

Sortida:

 running safely with 60km. 

Exemple de polimorfisme en temps d'execució de Java: Banc

Penseu en un escenari en què el banc és una classe que proporciona un mètode per obtenir el tipus d'interès. No obstant això, el tipus d'interès pot variar segons els bancs. Per exemple, els bancs SBI, ICICI i AXIS proporcionen tipus d'interès del 8,4%, 7,3% i 9,7%.

Exemple de banc de polimorfisme en temps d'execució de Java

Nota: aquest exemple també es dóna a la substitució del mètode, però no hi va haver cap upcasting.

 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()); } } 
Prova-ho ara

Sortida:

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

Exemple de polimorfisme en temps d'execució 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(); } } 
Prova-ho ara

Sortida:

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

Exemple de polimorfisme en temps d'execució 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(); }} 
Prova-ho ara

Sortida:

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

Polimorfisme en temps d'execució de Java amb membre de dades

S'invalida un mètode, no els membres de dades, de manera que els membres de les dades no poden aconseguir el polimorfisme en temps d'execució.

A l'exemple que es mostra a continuació, ambdues classes tenen un límit de velocitat per a membres de dades. Estem accedint al membre de dades mitjançant la variable de referència de la classe pare que fa referència a l'objecte de la subclasse. Com que estem accedint al membre de dades que no està anul·lat, per tant accedirà sempre al membre de dades de la classe Parent.

Regla: el polimorfisme en temps d'execució no el poden aconseguir els membres de les dades.

 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 } } 
Prova-ho ara

Sortida:

java parseint
 90 

Polimorfisme en temps d'execució de Java amb herència multinivell

Vegem un exemple senzill de polimorfisme en temps d'execució amb herència multinivell.

 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(); } } 
Prova-ho ara

Sortida:

 eating eating fruits drinking Milk 

Prova de sortida

 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(); }} 
Prova-ho ara

Sortida:

 Dog is eating 

Com que BabyDog no anul·la el mètode eat(), s'invoca el mètode eat() de la classe Dog.