ב-JavaRush, התלמידים מתוודעים למילת המפתח ממש מההרצאות הראשונות
ומסתבר שאתה פשוט מקצה ערך למשתנה
כלומר,
ולהלן קוד התוכנית עם מילת המפתח
this
. ועם הזמן מתברר מה זה אומר. אבל רבים, במבט לאחור, בטח יאמרו לעצמם בכנות שבמשך זמן רב הם לא יכלו להבין את הזן של מילת המפתח הזו. במאמר זה אנו מרימים את מסך הסודות לגבי השימוש במילות מפתח this
למי שעדיין לא מצליח להבין את זה... ברוך הבא! אם תרים את ספר העיון של ג'אווה של Schildt , בעמוד 171 תקרא שנדרשת מילת מפתח this
כדי ששיטה תוכל להתייחס לאובייקט שקרא לה. זה באמת יכול להיות הסוף של זה. אבל אנחנו צריכים פרטים. ככלל, this
יש להשתמש בו בשני מקרים:
- כאשר למשתנה מופע מחלקה ולמשתנה מתודה/בנאי יש אותו שם;
- כאשר אתה צריך לקרוא לבנאי מסוג אחד (לדוגמה, בנאי ברירת מחדל או פרמטר) מסוג אחר. זה נקרא גם קריאת בנאי מפורשת.
דוגמה ראשונה - משתנה מופע ומשתנה מתודה בעלי אותו שם
נניח שיש לנו מחלקהHuman
שעבורה מוגדר השדה "שם": בוא name
ניצור קובע למשתנה (המקבע די עובד ואין כאן טריק): שימו לב שאנחנו מעבירים את המשתנה למתודה (מגדיר ) . הצגנו משתנה חדש ו(באופן כללי) יכולנו לקרוא לו איך שרצינו כי הוא יהיה גלוי רק בתוך {הסוגרים המתולתלים} של השיטה . שימו לב שיש שורה אחת במגדיר: setName
String newName
setName
name = newName;
כלומר, למעשה, הכנסנו משתנה חדש newName
והקצנו אותו למשתנה שכבר קיים במחלקה name
. מתכנתים רבים חשבו שזה מוזר להכניס משתנה עם שם חדש אם בסופו של דבר אנחנו מדברים על אותו דבר. לגבי השם בכיתה Human
. לכן, מפתחי השפה חשבו לעשות את זה נוח להשתמש בשם משתנה אחד. במילים אחרות, למה יש שני שמות למשתנה שמשמעותו אותו הדבר. כלומר, הייתי רוצה לעשות משהו כזה: אבל במקרה הזה מתעוררת בעיה . כעת יש לנו שני משתנים שנקראים זהים. האחד String name
שייך למחלקה Human
והשני String name
לשיטתו setName
. לכן, מכונת ה-Java לא יודעת לאיזה משתנה אתה מתכוון כשאתה כותב מחרוזת ב-setter:
name = name;
Java לוקח את הקרוב ביותר - name
מהשיטה setName
:
name
מהשיטה הזו, אליו. מה שכמובן לא הגיוני. לכן נדרשה דרך כלשהי להבחין בין משתנה name
ממחלקה Human
למשתנה name
מתודה setName
.כדי לפתור בעיה זו הוכנסה מילת המפתח this
, שבמקרה זה תצביע על כך שיש צורך לקרוא למשתנה לא של מתודה, אלא של כיתה Human
:
this
הוא יתייחס לאובייקט הקורא, כפי שנאמר בתחילת המאמר. כתוצאה מכך, שמו של האדם setName
יוגדר דרך המגדיר לאובייקט שנוצר. להלן הקוד ללא שימוש במילת המפתח this
. הקוד יוצר אובייקט מחלקה Human
ונותן לו שם:
this
:
public class Solution{
public static void main(String[] args) {
Human human1 = new Human();
human1.setName("Volodya");
human1.print();
}
}
class Human{
String name;
public String getName() {
return name;
}
public void setName(String name){
this.name = name;
}
void print(){
System.out.println(name);
}
}
לפיכך, הוא this
נמנע מלהכניס משתנים חדשים לציון אותו דבר, מה שהופך את הקוד לפחות "עמוס" במשתנים נוספים.
דוגמה שנייה - שימוש בזה כדי לקרוא במפורש לבנאי
קריאה של בנאי אחד מהאחר יכולה להיות שימושית כאשר יש לך (באופן מוזר) כמה בנאים ואתה לא רוצה לשכתב את קוד האתחול שניתן קודם לכן בבנאי בבנאי חדש. מְבוּלבָּל? הכל לא מפחיד כמו שזה נראה. תסתכל על הקוד למטה, יש לו שני בנאי מחלקותHuman
:
class Human{
int age;
int weight;
int height;
Human(int age, int weight){
this.age = age;
this.weight = weight;
}
Human(int age, int weight, int height){
//you call the constructor with two parameters
this(age, weight);
//and add the missing variable
this.height = height;
}
}
כאן יש לנו קודם כל בנאי שני פרמטרים שמקבל int age
ו int weight
. נניח שכתבנו בו שתי שורות קוד:
this.age = age;
this.weight = weight;
ואז הם החליטו להוסיף עוד בנאי, עם שלושה פרמטרים, שמלבד גיל ומשקל, גם לוקח גובה. בקונסטרוקטור החדש אתה יכול לכתוב את זה:
this.age = age;
this.weight = weight;
this.height = height;
אבל במקום לחזור על הקוד שכבר כתבת בבנאי זה, אתה יכול להשתמש במילת מפתח כדי this
לקרוא במפורש לבנאי עם שני פרמטרים:
this(age, weight);
// and add the missing variable:
this.height = height;
אז אתה סוג של אומר לבנאי עם שלושה פרמטרים:
- קרא לבנאי זה, שיש לו שני פרמטרים.
- ולהוסיף את המשתנה החסר.
this
מועברת לכל השיטות למעט סטטיות (ולכן היא this
נקראת לעתים קרובות פרמטר מרומז) וניתן להשתמש בה כדי להתייחס לאובייקט שקרא לשיטה. אין צורך לפחד ממילת המפתח הזו, כי This
היא לא מפחידה.
GO TO FULL VERSION