מעבר והחזרת ערכים על ידי התייחסות
הוצג| English | משמעות |
|---|---|
| NullPointerException/nʌl ˈpɔɪntə ekˈsepʃn/ | שגיאת נקודה ריקה |
שינוי אובייקט שונה מהקלדה מחדש של פרמטר
- קורא מתייחס לתלמיד עם נקודות 10. המטודה מבצעת s.addScore(5); ואז s = new Student("Other");
- הנקודות של האובייקת המשותף המקורי הופכות ל15. הקלדה מחדש של הפרמטר המקומי אינה משנה את משתנה הקורא, כי Java מעתיקה את ערך הייחוס לתוך הפרמטר.
העברת אובייקט לשיטה
- Java מעתיקה את ערך הייחוס לתוך פרמטר המטודה; היא אינה מעתיקה את האובייקת. פרמטר המטודה מצביע על אותו אובייקת כמו משתנה הקורא.
- לכן שינויים שמטודה עושה באובייקת נראים לקורא. גם ארגומנטים פרימיטיביים וגם ארגומנטים ייחוס מועברים בערך; הייחוס המועתק עדיין יכול לגשת לאובייקת משותף.
פרמיטיבים מול אובייקטים כפרמטרים
- ארגומנט פרימיטיבי מועתק — המטודה לא יכולה לשנות את משתנה הקורא. עבור ארגומנט אובייקת, הייחוס המועתק מגיע לאותו אובייקת — המטודה יכולה לשנות את האובייקת הזה.
changeInt(x)לא יכול לשנות אתx;student.addScore(10)כן משנה את התלמיד הזה. שאל האם המטודה משנה את האובייקת המשותף או רק מקלדת מחדש את הפרמטר המקומי שלה.
החזרת אובייקט מתוך
- מטודה יכולה להחזיר ייחוס לאובייקת — הקורא אז משתף אותו.
public Student topStudent() { return best; }מחזיר ייחוס לbest. - ההשבה
bestמשתפת אובייקט קיים. לעומת זאת,return new Student("Copy");בונה אובייקט חדש ומחזירה את הייחוס אליו; מטהוד יכול גם להשיבnull. קרא את הביטוי המוחזר לפני שאתה מחליט האם מצב משותף.
העתקת ייחוס, אובייקט משותף; העתקה של ערך פרמיטיבי
ערך הניקוד של האובייקט משתנה; המשתנה x הפרמיטיבי אינו משתנה.
כשעוברים אובייקט למטהודה, המטהודה מקבלת...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Java מעתיקה את ערך הייחוס לתוך משתנה פרמטר נפרד. שני הייחוסים יכולים להגיע לאותו אובייקט; השבת ערך בפרמטר אינה מחליפה את משתנה הקורא.
מטהודה יכולה לשנות משתנה int של הקורא על ידי שינוי הפרמטר שלה.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
ערכים פרמיטיביים מועתקים — משתנה int של הקורא נשאר ללא שינוי.
השערת שיטת אינסטנץ דרך ייחוס null גורמת ל...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
null אינו מצביע על שום אובייקט, ולכן אין מה לקרוא עליו את המטהודה.
מטהודה יכולה להחזיר התייחסות לאובייקט, שהקורא ישתמש בה מאוחר יותר.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
שיטה יכולה להחזיר ייחוס לאובייקט קיים ולשתף אותו עם הקורא. שיטה אחרת יכולה לבנות ולהחזיר אובייקט חדש במקום זאת.
כדי להשתמש בבטחה בהתייחסות שעשויה להיות נולל, עליך לבדוק תחילה אם...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
הגן על null לפני ביצוע שיטה עליו.
כל שיטה שמחזירה ייחוס Student חייבת להחזיר אובייקט שקיים מראש.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
שגוי: return new Student("Other"); בונה ומחזיר אובייקט חדש.
הייחוס null
- ייחוס שמצביע על אין אובייקט הוא
null. שיחה על מטהוד מסד דרךnullגורמת ל-NullPointerException. - השבת
null(למשל "לא נמצא") היא נפוצה — הקורא חייב לבדוק אותה. הגן עםif (s != null) { s.addScore(10); }לפני השימוש בייחוס שאינו-נוול אפשרי.
העברת אובייקט מעתיקה ערך ייחוס — המטהוד יכול לשנות את האובייקט של הקורא; העברת פרימיטיב מעתיקה את הערך — הוא לא יכול. לכן student.addScore(10) משנה את האובייקט של הקורא, אך changeInt(x) משאיר את ה-x של הקורא ללא שינוי. ושיחה על מטהוד מסד דרך ייחוס null גורמת ל-NullPointerException — בדוק != null תחילה כאשר ייחוס עשוי להיות נוול.
After the two statements, what is the original caller-referenced Student score?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
The first statement mutates the original object to 15. The later local reassignment does not replace the caller reference.
שיטה מחזירה new Student("Other"); אך הקורא מתעלם מהתוצאה. מה קורה למשתנה Student הקיים בקורא?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
החזרת ייחוס אינה מצבנת אותו במשתנה הקורא. המשתנה הקיים עדיין מצביע על האובייקט המקורי שלו.
ייחוס לעומת ערך:
void addTen(Student s) { s.addScore(10); }— משנה את האובייקט שהועבר (ייחוס משותף).void addTen(int x) { x += 10; }— ה-intשל הקורא נשאר ללא שינוי (ערך מועתק).- שני ערכי הפרמטר מעותקים; רק הייחוס המועתק מגיע למצב משתנה משותף.
להעביר את הניתוח למקרה חדש
- השוו בין
return s;ל-return new Student("Other");: הראשון מחזיר את הייחוס המסופק; השני מחזיר אובייקט שנבנה מחדש. אף אחד מהם אינו משנה את המשתנה של הקורא עד שהקורא יAssign את התוצאה. - כדי לחזות שינוי, צייר את הקורא ואת הפרמטר כמשתני ייחוס נפרדים המצביעים על אובייקטים. עדכן את האובייקט עבור שיחה של mutator, ועדכן רק את חץ הפרמטר עבור החזרה מחדש של פרמטר.
העברת ייחוס אובייקט מעתיקה את ערכו לתוך הפרמטר, ולכן המטהוד יכול לשנות את האובייקט של הקורא; העברת פרימיטיב מעתיפה את הערך, ולכן הוא לא יכול. מטהוד יכול להשיב ייחוס לאובייקט. ייחוס לאובייקט אין הוא null — שיחה על מטהוד מסד דרכו גורמת ל-NullPointerException, ולכן בדוק תחילה.