דילוג לתוכן המרכזי
מודול 3 · שיעור 1 מתוך 25/14 בקורס~12 min
שיעורי מודול (1/2)

ירושה

ירושה הוא מנגנון בסיסי של OOP המאפשר למחלקה (הנקראת מחלקת ילד או תת-מחלקה) לרשת שדות ושיטות ממחלקה אחרת (נקראת מחלקה אב או מחלקה על).

זה מקדם שימוש חוזר בקוד ומונע חזרה מיותרת.

הרחבת כיתה עם extends

ב-Java, אנו משתמשים במילת המפתח extends כדי לציין שמחלקה יורשת מאחרת:

Java
class Vehicle {
    protected int speed; // 'protected' makes the field visible to subclasses

    public void honk() {
        System.out.println("Beep beep!");
    }
}

class Car extends Vehicle {
    // Car automatically inherits the speed field and the honk() method
}

הבנאי ומילת המפתח super()

אם למחלקת העל יש בנאי שמקבל פרמטרים, תת המחלקה חייבת לקרוא לו במפורש בבנאי שלה באמצעות super(...) בתור המשפט הראשון מאוד:

Java
class Person {
    String name;

    public Person(String name) {
        this.name = name;
    }
}

class Student extends Person {
    int studentId;

    public Student(String name, int studentId) {
        super(name); // Invokes the constructor of Person
        this.studentId = studentId;
    }
}

עקיפת שיטה (@Override)

תת-מחלקה יכולה לספק יישום ספציפי משלה לשיטה שעברה בירושה ממחלקת העל. פעולה זו נקראת עקיפה (עקיפה של שיטה) והיא מסומנת על ידי ההערה @Override.

Java
class Animal {
    public void makeSound() {
        System.out.println("Rumore generico");
    }
}

class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Miao!");
    }
}

השינוי protected

משנה הגישה protected ממלא תפקיד מפתח בירושה. בניגוד ל-private, מה שהופך את החברים לגלויים רק בתוך אותה מחלקה, protected מאפשר גישה לשדות ושיטות הן בתוך אותה חבילה והן על ידי כל תת המחלקות, גם אם הם נמצאים בחבילות שונות.

גישה לחברי הורים עם super

בנוסף לקריאה לבנאי מחלקות העל, ניתן להשתמש במילת המפתח super בתוך שיטות תת מחלקות כדי להתייחס לשיטות או למשתנים של מחלקת האב. זה שימושי במיוחד כאשר שיטה נדחפת, אבל אתה עדיין רוצה להפעיל את התנהגות ההורה המקורית:

Java
class Animal {
    public void sleep() {
        System.out.println("Zzz");
    }
}

class Cat extends Animal {
    @Override
    public void sleep() {
        super.sleep(); // Executes the behavior of Animal
        System.out.println("The cat purrs while sleeping.");
    }
}

ירושה יחידה בג'אווה

ב-Java, מחלקה יכולה להרחיב מחלקה אחת בלבד (ירושה בודדת). ירושה ישירה ממספר מחלקות (ירושה מרובה) אינה מותרת; לדוגמה, class Cat extends Animal, Mammal יגרום לשגיאת קומפילציה. בחירת עיצוב זו מונעת אי בהירות המכונה "בעיית היהלומים" (כאשר שתי מחלקות-על מגדירות את אותה שיטה עם יישומים שונים). כדי להתגבר על מגבלה זו, Java מציגה את המושג ממשקים, אותו נחקור במודול הבא.


נסה זאת בעצמך

פעילות גופנית#java.m3.l1.e1
ניסיונות: 0טוען...

השלם את תת המחלקה Dog על ידי הרחבת Animal. הכריז על בנאי הכלב שמקבל שם (מחרוזת) ומשתמש בסופר(שם) כדי להעביר אותו לבנאי החיות.

טוען עורך...
הצג רמז

כתוב `כלב ציבורי(שם מחרוזת) { super(שם); }` בתוך כיתת הכלב.

הפתרון זמין לאחר 3 ניסיונות

פעילות גופנית#java.m3.l1.e2
ניסיונות: 0טוען...

הרחב את Dog מ- Animal ועקוף את שיטת makeSound() כך שתחזיר את המיתר Woof במקום Generic Sound. השתמש בהערה @Override.

טוען עורך...
הצג רמז

כתוב `@Override` מעל ההצהרה `public String makeSound() { return 'Woof'; }` בתוך כלב.

הפתרון זמין לאחר 3 ניסיונות

פעילות גופנית#java.m3.l1.e3
ניסיונות: 0טוען...

הכריז על מחלקה Cat שמרחיבה את Animal ומעקפת את שיטת makeSound() כדי להחזיר את המחרוזת Meow. לכיתה Animal כבר יש בנאי שמקבל שם; ודא שגם בנאי ה-Cat מקבל שם ומעביר אותו בצורה נכונה לבנאי מחלקת העל.

טוען עורך...
הצג רמז

צור את הכיתה 'חתול' המשתרעת על 'חיה'. הכריז על הקונסטרוקטור `public Cat(String name) { super(name); }` ועקוף את שיטת `makeSound()` באמצעות `@Override` כדי להחזיר `'Meow'`.

הפתרון זמין לאחר 3 ניסיונות