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:
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%.
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.