Polimorfismul în Java este un concept prin care putem realiza a o singură acțiune în moduri diferite . Polimorfismul este derivat din 2 cuvinte grecești: poli și morphs. Cuvântul „poli” înseamnă multe, iar „morphs” înseamnă forme. Deci polimorfismul înseamnă multe forme.
Există două tipuri de polimorfism în Java: polimorfism în timp de compilare și polimorfism în timp de execuție. Putem efectua polimorfism în java prin supraîncărcare de metodă și suprascriere metode.
Dacă supraîncărcați o metodă statică în Java, aceasta este exemplul de polimorfism în timp de compilare. Aici, ne vom concentra pe polimorfismul runtime în java.
Polimorfismul runtime în Java
Polimorfismul runtime sau Expediere prin metoda dinamică este un proces în care un apel la o metodă suprascrisă este rezolvat în timpul execuției, mai degrabă decât în timpul compilării.
În acest proces, o metodă suprascrisă este apelată prin variabila de referință a unei superclase. Determinarea metodei care trebuie apelată se bazează pe obiectul la care se referă variabila de referință.
java listnode
Să înțelegem mai întâi upcasting-ul înainte de Runtime Polymorphism.
Upcasting
Dacă variabila de referință a clasei Parent se referă la obiectul clasei Child, este cunoscută ca upcasting. De exemplu:
class A{} class B extends A{}
A a=new B();//upcasting
Pentru upcasting, putem folosi variabila de referință de tip clasă sau un tip de interfață. De exemplu:
interface I{} class A{} class B extends A implements I{}
Aici, relația dintre clasa B ar fi:
B IS-A A B IS-A I B IS-A Object
Deoarece Object este clasa rădăcină a tuturor claselor din Java, putem scrie B IS-A Object.
Exemplu de polimorfism Java Runtime
În acest exemplu, creăm două clase Bike și Splendor. Clasa Splendor extinde clasa Bike și suprascrie metoda run(). Apelăm metoda run prin variabila de referință a clasei Parent. Deoarece se referă la obiectul subclasă și metoda subclasă suprascrie metoda clasei părinte, metoda subclasei este invocată în timpul execuției.
șir de matrice java
Deoarece invocarea metodei este determinată de JVM, nu de compilator, este cunoscută ca polimorfism de rulare.
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(); } }Testează-l acum
Ieșire:
running safely with 60km.
Exemplu de polimorfism Java Runtime: Bank
Luați în considerare un scenariu în care Banca este o clasă care oferă o metodă de a obține rata dobânzii. Cu toate acestea, rata dobânzii poate diferi în funcție de bănci. De exemplu, băncile SBI, ICICI și AXIS oferă o dobândă de 8,4%, 7,3% și 9,7%.
Notă: Acest exemplu este dat și în anularea metodei, dar nu a existat nicio 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()); } }Testează-l acum
Ieșire:
SBI Rate of Interest: 8.4 ICICI Rate of Interest: 7.3 AXIS Rate of Interest: 9.7
Exemplu de polimorfism Java Runtime: Formă
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(); } }Testează-l acum
Ieșire:
drawing rectangle... drawing circle... drawing triangle...
Exemplu de polimorfism Java Runtime: 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(); }}Testează-l acum
Ieșire:
eating bread... eating rat... eating meat...
Polimorfism Java Runtime cu membru de date
O metodă este suprascrisă, nu membrii datelor, astfel încât polimorfismul de rulare nu poate fi realizat de membrii datelor.
În exemplul de mai jos, ambele clase au o limită de viteză pentru membrii de date. Accesăm membrul de date prin variabila de referință a clasei Părinte care se referă la obiectul subclasă. Deoarece accesăm membrul de date care nu este suprascris, de aceea va accesa întotdeauna membrul de date al clasei Părinte.
Regula: polimorfismul de rulare nu poate fi realizat de membrii datelor.
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 } }Testează-l acum
Ieșire:
90
Polimorfism Java Runtime cu moștenire pe mai multe niveluri
Să vedem exemplul simplu de polimorfism în timp de rulare cu moștenire pe mai multe niveluri.
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(); } }Testează-l acum
Ieșire:
legi de echivalență
eating eating fruits drinking Milk
Încercați pentru Output
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(); }}Testează-l acum
Ieșire:
Dog is eating
Deoarece BabyDog nu suprascrie metoda eat(), deci este invocată metoda eat() din clasa Dog.