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

(hello) מה ניתן לומר על קוד הג'אווה הבא (בהנחה שהוא לבדו מופיע בתוך מתודת main)?
הערה: בנספח מופיע חומר עזר (תיעוד של הספריה הסטנדרטית) עבור המתודות המופיעות בקוד.


1. השורה השניה של הקוד (המכילה קריאה ל- replace) לא תתקמפל

2. השורה השלישית של הקוד (המכילה קריאה ל- toLowerCase) לא תתקמפל

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

4. הקוד מתקמפל ורץ ובסופו o יהיה המחרוזת Hello

5. הקוד מתקמפל ורץ ובסופו o יהיה המחרוזת yello
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד ב2021סמסטר ב
אובייקטיםפולימורפיזםcastingמעקב אחר קוד
הקומפיילר קובע אילו מתודות ניתן להפעיל על משתנה לפי הטיפוס הסטטי (המוצהר) שלו, לא לפי הטיפוס הדינמי (של האובייקט בפועל). מהו הטיפוס המוצהר של המשתנה o?
התשובה הנכונה היא 2.
נתחבר את הקוד שורה אחר שורה:

1. Object o = "Hello";

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


2. o = ((String)o).replace('H', 'Y');
בשורה זו, כדי לקרוא למתודה replace השייכת למחלקה String, אנו חייבים לבצע downcasting (הורדה בסוג) למשתנה o מטיפוס Object לטיפוס String. ההמרה (String)o תצליח בזמן ריצה כיוון ש-o אכן מצביע לאובייקט מסוג String. המתודה replace מחזירה אובייקט String חדש, "Yello", וההשמה ל-o היא שוב upcasting חוקי. לכן, שורה זו תתקמפל ותרוץ ללא שגיאות.


3. o = o.toLowerCase();
כאן הבעיה. הקומפיילר בודק את הטיפוס *הסטטי* (המוצהר) של המשתנה o, שהוא Object. למחלקה Object אין מתודה בשם toLowerCase(). מכיוון שהקומפיילר לא מוצא מתודה כזו עבור הטיפוס Object, הוא יפיק שגיאת קומפילציה. כדי שהקוד יתקמפל, היה צורך לבצע שוב casting ל-String: o = ((String)o).toLowerCase();. ללא ה-casting, הקוד לא יעבור קומפילציה.
שאלת מבחן בתכנות מונחה עצמים - אוניברסיטת בר-אילן 2021 | prepd