שאלת מבחן בתכנות מונחה עצמים - אוניברסיטת בר-אילן 2025 - אובייקטים

נתון קוד הבא



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


סמנו את כל שורות הקוד שניתן להציב במקום "שורת קוד להשלמה" בקוד הנתון כך שהקוד יהיה תקין, כלומר, כך שלא נקבל שגיאות קומפילציה וגם לא נקבל שגיאות זמן ריצה.


א. System.out.println(a);


ב. a.equals(a);


ג. a.clone();


ד. a.toString();


ה. אף אחת מהשורות קוד הנ״ל אינה מתאימה להיות בשורת ההשלמה


נמקו בקצרה את תשובתכם.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד א2025סמסטר א
אובייקטיםמחלקותירושהOverridingממשקיםחריגותמעקב אחר קוד
כל מחלקה ב-Java יורשת באופן מובלע ממחלקת הבסיס Object. בדקו אילו מהמתודות המופיעות בשאלה מוגדרות כציבוריות (public) במחלקת Object ואילו דורשות תנאים מיוחדים.
השורות המתאימות הן א, ב, ו-ד.

הנימוק מבוסס על כך שכל מחלקה ב-Java, גם אם לא מצוין זאת במפורש, יורשת מהמחלקה `Object`. מחלקה זו מספקת מימוש ברירת מחדל למספר מתודות בסיסיות, הזמינות לכל אובייקט.


* א. `System.out.println(a);`: שורה זו תקינה. המתודה println יודעת לקבל כל אובייקט. היא קוראת באופן מובלע למתודה `a.toString()` כדי לקבל ייצוג מחרוזתי של האובייקט ולהדפיסו. מכיוון שלכל אובייקט יש מתודת `toString()` (שנורשת מ-`Object`), קריאה זו תמיד תצליח.


* ב. `a.equals(a);`: שורה זו תקינה. המתודה `equals(Object obj)` היא מתודה ציבורית (public) במחלקה `Object`, ולכן כל אובייקט יורש אותה. הקריאה למתודה עם האובייקט עצמו כארגומנט היא חוקית לחלוטין ולא תגרום לשגיאת קומפילציה או ריצה.


* ג. `a.clone();`: שורה זו אינה בהכרח תקינה, ועלולה לגרום לשגיאת קומפילציה או לשגיאת זמן ריצה.
1. שגיאת קומפילציה: המתודה `clone()` במחלקה `Object` מוגדרת כ-protected. המשמעות היא שניתן לקרוא לה רק מתוך אותה חבילה (package) או ממחלקה יורשת. מכיוון שאין לנו מידע על המחלקה של a או על החבילה שלה, הקריאה עלולה להיכשל בקומפילציה. כדי שהקריאה תהיה חוקית מכל מקום, המחלקה של a הייתה צריכה לבצע `Overriding` של המתודה `clone()` ולהגדיר אותה כ-public.

2. שגיאת זמן ריצה: גם אם המחלקה של a דורסת את `clone()` והופכת אותה לציבורית, מימוש ברירת המחדל של `clone()` ב-`Object` זורק חריגה מסוג `CloneNotSupportedException` אם המחלקה אינה מממשת את הממשק `Cloneable`. אין לנו ערובה שהמחלקה של a מממשת ממשק זה.

לכן, לא ניתן להבטיח ששורה זו תהיה תקינה.


* ד. `a.toString();`: שורה זו תקינה. המתודה `toString()` היא מתודה ציבורית (public) במחלקה `Object`, ולכן כל אובייקט יורש אותה. קריאה למתודה זו היא תמיד חוקית ולא תגרום לשגיאה.