B יורשת מ-A ודורסת f ו-g. A.g קוראת ל-f() על this (קריאה וירטואלית — מתפזרת לגרסה של B בזמן ריצה, לפי הטיפוס האמיתי, לא המוצהר). B.superG עוקפת את הדריסה במפורש עם super.g() וקוראת דווקא לגרסת A של g — אבל בתוכה, ה-f() הפנימית עדיין וירטואלית ומתפזרת ל-B.f.
B יורשת מ-A ודורסת f ו-g. A.g קוראת ל-f() על this (קריאה וירטואלית — מתפזרת לגרסה של B בזמן ריצה, לפי הטיפוס האמיתי, לא המוצהר). B.superG עוקפת את הדריסה במפורש עם super.g() וקוראת דווקא לגרסת A של g — אבל בתוכה, ה-f() הפנימית עדיין וירטואלית ומתפזרת ל-B.f.
class A{
public void f() {
System.out.println("A.f");
}
public void g() {
f();
}
}
public class B extends A{
public void f(){
System.out.println("B.f");
}
public void g() {
System.out.println("B.g");
}
public void superG() {
super.g();
}
}
סעיף א
נתון קטע הקוד הבא: A a = new A(); B b = new B(); A ab = new B(); a.f(); ab.f(); b.f(); a.g(); ab.g(); b.g(); ((B)(ab)).superG(); b.superG(); עקבו אחרי ביצוע קטע הקוד ורשמו מה יהיה הפלט.
סעיף ב
האם אפשר להוסיף לקטע הקוד את שתי הפקודות הבאות? a.superG(); ((B)a).superG(); הסבירו את תשובתכם.
שאלות ותגובות על השאלה
🎓 לא הבנתם משהו? קבלו הסבר נוסף ממרצה לתכנות
שאלו כאן — ותקבלו מענה מוסמך.