logo

Polimorfismul în Java

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:

Upcasting în Java
 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%.

Java Runtime Polymorphism exemplu de bancă

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.