פולימורפיזם בג'אווה הוא מושג שבאמצעותו אנו יכולים לבצע א פעולה בודדת בדרכים שונות . פולימורפיזם נגזר מ-2 מילים יווניות: פולי ומורפים. המילה 'פולי' פירושה רבים ו'מורפים' פירושה צורות. אז פולימורפיזם פירושו צורות רבות.
ישנם שני סוגים של פולימורפיזם בג'אווה: פולימורפיזם בזמן הידור ופולימורפיזם בזמן ריצה. אנו יכולים לבצע פולימורפיזם בג'אווה על ידי עומס יתר של שיטה ועקוף שיטה.
אם אתה עומס יתר על המידה שיטה סטטית ב-Java, זו הדוגמה לפולימורפיזם של זמן קומפילציה. כאן נתמקד בפולימורפיזם בזמן ריצה ב-java.
ריצה פולימורפיזם ב-Java
פולימורפיזם בזמן ריצה אוֹ שיגור שיטה דינמית הוא תהליך שבו קריאה למתודה שנדחקה נפתרת בזמן ריצה ולא בזמן הידור.
בתהליך זה נקראת שיטה עוקפת דרך משתנה ההתייחסות של מחלקת-על. קביעת השיטה להקראה מבוססת על האובייקט שאליו מתייחס משתנה ההתייחסות.
בואו נבין תחילה את השידור לפני Runtime Polymorphism.
מעלה
אם משתנה ההתייחסות של מחלקה אב מתייחס לאובייקט של מחלקה Child, הוא ידוע בשם upcasting. לדוגמה:
class A{} class B extends A{}
A a=new B();//upcasting
עבור שידור, אנו יכולים להשתמש במשתנה ההתייחסות של סוג מחלקה או סוג ממשק. לדוגמה:
interface I{} class A{} class B extends A implements I{}
כאן, הקשר של מחלקה ב' יהיה:
B IS-A A B IS-A I B IS-A Object
מכיוון ש-Object היא מחלקת השורש של כל המחלקות ב-Java, אז אנחנו יכולים לכתוב B IS-A Object.
דוגמה לפולימורפיזם של Java Runtime
בדוגמה זו, אנו יוצרים שני מחלקות Bike ו-Splendor. מחלקה Splendor מרחיבה את מחלקת ה-Bike ומעקפת את שיטת ה-run() שלו. אנו קוראים לשיטת הריצה על ידי משתנה ההתייחסות של מחלקה אב. מכיוון שהוא מתייחס לאובייקט תת-המחלקה ומתודה תת-מחלקה עוקפת את שיטת מחלקת האב, שיטת המשנה מופעלת בזמן ריצה.
מכיוון שהפעלת השיטה נקבעת על ידי ה-JVM לא מהדר, היא ידועה כפולימורפיזם בזמן ריצה.
פתח את תפריט ההגדרות
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(); } }בדוק את זה עכשיו
תְפוּקָה:
running safely with 60km.
דוגמה לפולימורפיזם של Java Runtime: בנק
שקול תרחיש שבו בנק הוא מחלקה המספקת שיטה לקבל את שיעור הריבית. עם זאת, שיעור הריבית עשוי להשתנות בהתאם לבנקים. לדוגמה, הבנקים SBI, ICICI ו-AXIS מספקים ריבית של 8.4%, 7.3% ו-9.7%.
הערה: דוגמה זו ניתנת גם בהחלפת שיטה, אך לא היה שידור.
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()); } }בדוק את זה עכשיו
תְפוּקָה:
SBI Rate of Interest: 8.4 ICICI Rate of Interest: 7.3 AXIS Rate of Interest: 9.7
דוגמה לפולימורפיזם של Java Runtime: Shape
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(); } }בדוק את זה עכשיו
תְפוּקָה:
drawing rectangle... drawing circle... drawing triangle...
דוגמה לפולימורפיזם של Java Runtime: בעלי חיים
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(); }}בדוק את זה עכשיו
תְפוּקָה:
eating bread... eating rat... eating meat...
Java Runtime Polymorphism עם Data Member
שיטה מדרסת, לא איברי הנתונים, כך שלא ניתן להשיג פולימורפיזם בזמן ריצה על ידי חברי נתונים.
בדוגמה להלן, לשתי המחלקות יש מגבלת מהירות של חברי נתונים. אנו ניגשים לאיבר הנתונים על ידי משתנה ההתייחסות של מחלקה אב המתייחס לאובייקט המשנה. מכיוון שאנו ניגשים לאיבר הנתונים שאינו מוחלף, מכאן שהוא ייגש תמיד לאיבר הנתונים של מחלקת האב.
כלל: לא ניתן להשיג פולימורפיזם בזמן ריצה על ידי חברי נתונים.
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 } }בדוק את זה עכשיו
תְפוּקָה:
90
פולימורפיזם של Java Runtime עם ירושה רב-שכבתית
בואו נראה את הדוגמה הפשוטה של ריצה פולימורפיזם עם ירושה רב-שכבתית.
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(); } }בדוק את זה עכשיו
תְפוּקָה:
eating eating fruits drinking Milk
נסה עבור פלט
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(); }}בדוק את זה עכשיו
תְפוּקָה:
Dog is eating
מכיוון ש-BabyDog לא עוקף את שיטת eat() אז מופעלת שיטת eat() של המחלקה Dog.