Polymorphism: dynamic dispatch and toString() · פולימורפיזם: הפניה דינמית ו-toString()
Polymorphism: one type, many behaviours
- Polymorphism means "many forms": one superclass type, many subclass behaviours.
- You can hold a
Dogor aCatin anAnimalvariable, because each is-anAnimal. - When you call a method, the object's real type decides which version runs.
פולימורפיזם: סוג אחד, התנהגויות רבות
- פולימורפיזם פירושו "צורות רבות": סוג אב אחד, התנהגויות נגזרות רבות.
- ניתן לאחסן
DogאוCatבמשתנה מסוגAnimal, כי כל אחד מהווהAnimal. - כאשר קוראים לשיטה, הסוג האמיתי של האובייקת קובע איזה גרסה תרוץ.
Dynamic dispatch
- The variable's type (
Animal) decides which methods you are allowed to call. - But at run time, the actual object (
Dog) decides which overridden version runs. - This run-time choice is called dynamic dispatch — it is the heart of polymorphism.
נפוצות דינמית
- סוג המשתנה (
Animal) קובע אילו שיטות אפשר לכנות. - אך בזמן הרצה, האובייקט בפועל (
Dog) קובד איזה גרסה מוחלפת תופעל. - בחירה זו בזמן הרצה נקראת נפוצות דינמית — היא ליבת הפולימורפיזם.
public class Main {
public static void main(String[] args) {
Animal[] zoo = { new Dog(), new Cat(), new Dog() };
for (Animal a : zoo) {
System.out.println(a.speak()); // Woof, then Meow, then Woof
}
}
}
class Animal {
public String speak() { return "some sound"; }
}
class Dog extends Animal {
public String speak() { return "Woof"; }
}
class Cat extends Animal {
public String speak() { return "Meow"; }
}
One loop handles every subclass
- The loop above never asks "is this a Dog or a Cat?" — it just calls
speak(). - Each object answers in its own way. That keeps the loop short and general.
- Add a brand-new subclass later and the same loop works on it, unchanged.
לולאה אחת מטפל בכל תת-סוג
- הלולאה למעלה לעולם לא שואלת "האם זה כלב או חתול?" — היא פשוט מכילה
speak(). - כל אובייקט משיב בדרך שלו. הדבר שומר על הלולאה קצרה וכללית.
- תוסיף תת-סוג חדש לחלוטין בעתיד והאותה לולאה תעבוד עליו, ללא שינוי.
toString(): every object inherits it from Object
- Every class in Java secretly extends a class called
Object, which has atoString(). - Override
toString()to say how your object should look as text. - Java calls it automatically when you print an object or join it with
+.
toString(): כל אובייקט יורש אותו מObject
- כל מחלקה ב-Java מרחיבה במסתרים מחלקה הנקראת
Object, שיש להtoString(). - החלף את
toString()כדי לקבוע כיצד האובייקט שלך צריך להיראות כטקסט. - Java מכילה אותה אוטומטית כשאתה מדפיץ אובייקט או מחבר אותו עם
+.
public class Main {
public static void main(String[] args) {
Object x = new Fraction(3, 4);
System.out.println(x); // 3/4 -- toString() runs
System.out.println("ratio " + x); // ratio 3/4
}
}
class Fraction {
private int numerator;
private int denominator;
public Fraction(int numerator, int denominator) {
this.numerator = numerator;
this.denominator = denominator;
}
public String toString() {
return numerator + "/" + denominator;
}
}
Common mistakes
- The actual object's method runs at run time (dynamic dispatch), not the variable's type.
- Override
toString()for readable output.
טעויות נפוצות
- שיטת האובייקט בפועל רצה בזמן הרצה (נפוצות דינמית), ולא סוג המשתנה.
- החלף את
toString()לתפוקה קריאה.
Now you try
- Use a superclass array, add a new subclass, and override
toString(). - A hidden Harness checks that the right version runs for each object.
- Press Run to compile, then Check answer. Your code runs on the server, so even the first run is fast.
כעת תנסו בעצמכם
- השתמש בארגון של מחלקת על, הוסף תת-סוג חדש, והחלף את
toString(). - מעביר מוסתר בודק שהגרסה הנכונה רצה עבור כל אובייקט.
- לחץ על הפעל להרכבה, ואז על בדוק תשובה. הקוד שלך רץ על השרת, ולכן גם ההפעלה הראשונה מהירה.
Animal, Dog, and Cat are written for you. Complete the static method Zoo.chorus(Animal[] animals) so it returns every animal's sound joined by single spaces. Example: a Dog, Cat, Dog array gives "Woof Meow Woof". An empty array gives "". Loop and call speak() — let polymorphism pick the right sound. · Animal, Dog, ו-Cat נכתבו עבורך. השלם את השיטה הסטטית Zoo.chorus(Animal[] animals) כך שתחזיר את הצליל של כל חיה המחובר ברווחים יחידים. לדוגמה: מערך של Dog, Cat, Dog מחזיר "Woof Meow Woof". מערך ריק מחזיר "". עשה לופ וקרא ל-speak() — תנו לפולימורפיזם לבחור את הצליל הנכון.
Click Run to see the output here. · לחץ על הרץ כדי לראות את התוצא כאן.
Animal, Dog, Cat, and a working Zoo.chorus are written for you. Add a class Cow that extends Animal and overrides speak() to return "Moo". Notice the existing chorus loop handles your new Cow with no changes. · Animal, Dog, Cat וקוד עובד Zoo.chorus נכתבו עבורך. הוסף מחלקה Cow שמתרחבת מתוך Animal ומחליפה את speak() כדי להחזיר "Moo". שימו לב שהלולאה הקיימת ב-chorus מטפלת בקאו החד שלך בלי שינויים.
Click Run to see the output here. · לחץ על הרץ כדי לראות את התוצא כאן.
Complete Fraction by overriding toString() so it returns the fraction as "numerator/denominator" — for 3 and 4 it returns "3/4". Java calls toString() automatically when you print a Fraction or join it with +. · שלים את Fraction על ידי החלפת toString() כך שתחזיר את השבר כ-"numerator/denominator" — עבור 3 ו-4 היא תחזיר "3/4". Java קוראת ל-toString() אוטומטית כאשר מדפיסים Fraction או מחברים אותו עם +.
Click Run to see the output here. · לחץ על הרץ כדי לראות את התוצא כאן.