המילה המפתח this
הוצגפרמטר יכול להסתיר את השדה שהוא אמור לעדכן
- לאובייקט יש שם "Ada".named(String name) רץ עם assignment name = name; עם הארגומנט "Bo".
- שני השמות ללא סיומת שם מתייחסים לפרמטר, כך שהאובייקט עדיין יש לו "Ada". this.name = name מעבירה ערך הפרמטר לשדה במקום זאת.
"האובייקט הזה"
- בתוך מתוד instance,
thisמתייחס לאובייקט עליו נקראה המתוד.student.addScore(10)רץ עםthis= הstudentהזה. this.scoreפירושו "הscoreשל האובייקט שעובדים עליו". זה מאפשר למתוד לדבר על האובייקט שלה במפורש.
הבחנה בין שדה לפרמטר
- השימוש העיקרי: להבדיל בין משתנה instance לפרמטר באותו שם.
void setName(String name) { this.name = name; } this.nameהוא משתנה instance; פשוטnameהוא הפרמטר. זוהי הפתרון הסטנדרטי לbug הצלילה מ3.8.
גישה לאובייקט המקבל
thisנותן לשיטה ידית על האובייקט המדויק שבו נקראה. לכל שיטת instance ישthisאימפליסיטי, בין אם כותבים אותו או לא.- כאשר score מתייחס לשדה מוחלט (unshadowed instance field),
score += s;משתמש בthis.score. אם פרמטר או משתנה מקומי ששמו score משליך אותו, השם ללא qualifying מתייחס במקום זאת למשתנה הזה. כותביםthisבמפורש רק כשהדבר נדרש (כמו בפתרון של מצב השליכה).
דבר זה מתייחס לאובייקט המקבל
בתוך setName, this הוא האובייקט ada עליו הופעלה השיטה.
בתוך שיטת אובייקט, this מתייחס ל...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
this הוא ייחוס (handle) לאובייקט הנוכחי.
בתוך setName(String name) { this.name = name; }, this.name הוא...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
this.name הוא השדה; name רגיל הוא הפרמטר.
ניתן להשתמש במילה המפתח this בתוך שיטה סטטית.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
שיטות סטטיות אינן קשורות לאובייקט מסוים, ולכן אין להן this.
כתיבת name = name; (ללא this) בתוך setName(String name) עושה מה?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
שני השמות הם הפרמטר; השתמש ב-⟦this.name⟦ כדי להגיע לשדה.
לכל שיטת מופע יש ⟦this⟦ סמוי, בין אם כותב אותה או לא.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
שיטה אינסטנציאלית היא בעלת מקבל נוכחי. הביטוי score ללא פנייה משנה את this.score רק אם אין פרמטר או משתנה מקומי שמסתיר שדה זה.
אין this במתוד סטטית
- שיטה סטטית אין לה
this— היא אינה קשורה לאובייקט ספציפי כלשהו. לכן שיטה סטטית אינה יכולה להשתמש בthisאו בשדה אובייקט שאינו מוסמך, אך עשויה לקרוא שדה אובייקט באמצעות ייחוס מפורש כאשר רשות הגישה מאפשרת זאת. - ניסיון להשתמש ב
thisבתוך שיטה סטטית מהווה שגיאת תרגום. אם נדרש לthis, השיטה חייבת להיות שיטת אובייקט, ולא סטטית.
השתמש ב-this.field = param; כדי לפתור צלילה — this.name הוא משתנה אינסטנס, name רגיל הוא הפרמטר. כתיבת name = name; (ללא this) פשוט תחבר את הפרמטר לעצמו. וגם this לא קיים במתוד סטטית — למתוד סטטית אין אובייקט ספציפי, ולכן שימוש ב-this שם לא יקומפיל.
Type the field value after the faulty setName("Bo") call on the described object.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
The parameter assigns to itself; the field is unchanged until this.name is used on the left.
אם alias ו- a מופניםים לאותו Student, שינוי השם באמצעות alias.setName("Di") ישפיע על הערך הנקרא מאוחר יותר דרך a.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
שני המופנים מזהים את אותו אובייקט מקבל, ששדהו מעודכן.
קוד באובייקט b קורא ל-a.setName("Cy"). בתוך namedSet, איזה אובייקט הוא this?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
המקבל a מספק את this, ללא תלות במועילת הקריאה של אובייקט אחר.
תיקון באג הצלילה עם this:
- משתנה אינסטנס
private String name; void setName(String name) { this.name = name; }— נכון!this.name(השדה) מקבל את הערך שלname(הפרמטר).
להעביר את הניתוח למקרה חדש
- עקבו אחרי a ו-b כסטודנטים שנצרו בנפרד ושם האחד הוא Ada והשני Bo.
a.setName("Cy")משנה את a ל-Cy בעוד ש-b נשאר Bo. אם occurs alias=a,alias.setName("Di")משנה את אותו אובייקט ראשון, ולכן עכשיו a קורא Di. - המקבל (receiver) הוא האובייקט שעליו פועלת שיטת האינסטנציה, ולא בהכרח האובייקט שהקוד שלו קרא אותה. שיטה סטטית יכולה לפעול על רפרנס אובייקט מפורש, אך אין לה this אימליסיטי.
this מצביע על ה-אובייקט הנוכחי — זהו האובייקט שבו נקראה מתוד אינסטנס. השימוש העיקרי שלו הוא לפתור צלילה: this.name = name; תחבר את הפרמטר למשתנה האינסטנס. לכל מתוד אינסטנס יש this אימפליסיטי, אך מתוד סטטית אין לה, ולכן this לא יכול לשמש שם.