JavaRush /בלוג Java /Random-HE /מילת מפתח זו {בדוגמאות}

מילת מפתח זו {בדוגמאות}

פורסם בקבוצה
ב-JavaRush, התלמידים מתוודעים למילת המפתח ממש מההרצאות הראשונות this. ועם הזמן מתברר מה זה אומר. אבל רבים, במבט לאחור, בטח יאמרו לעצמם בכנות שבמשך זמן רב הם לא יכלו להבין את הזן של מילת המפתח הזו. במאמר זה אנו מרימים את מסך הסודות לגבי השימוש במילות מפתח thisלמי שעדיין לא מצליח להבין את זה... ברוך הבא! אם תרים את ספר העיון של ג'אווה של Schildt , בעמוד 171 תקרא שנדרשת מילת מפתח thisכדי ששיטה תוכל להתייחס לאובייקט שקרא לה. זה באמת יכול להיות הסוף של זה. אבל אנחנו צריכים פרטים. מילת מפתח זו {בדוגמאות} - 1ככלל, thisיש להשתמש בו בשני מקרים:
  1. כאשר למשתנה מופע מחלקה ולמשתנה מתודה/בנאי יש אותו שם;
  2. כאשר אתה צריך לקרוא לבנאי מסוג אחד (לדוגמה, בנאי ברירת מחדל או פרמטר) מסוג אחר. זה נקרא גם קריאת בנאי מפורשת.
זהו, ממש לא הרבה, רק שני מקרים שבהם נעשה שימוש במילת המפתח הנוראה הזו. עכשיו בואו נסתכל על שני המצבים האלה עם דוגמאות.

דוגמה ראשונה - משתנה מופע ומשתנה מתודה בעלי אותו שם

נניח שיש לנו מחלקה Humanשעבורה מוגדר השדה "שם": מילת מפתח זו {בדוגמאות} - 2בוא nameניצור קובע למשתנה (המקבע די עובד ואין כאן טריק): שימו לב שאנחנו מעבירים את המשתנה מילת מפתח זו {בדוגמאות} - 3למתודה (מגדיר ) . הצגנו משתנה חדש ו(באופן כללי) יכולנו לקרוא לו איך שרצינו כי הוא יהיה גלוי רק בתוך {הסוגרים המתולתלים} של השיטה . שימו לב שיש שורה אחת במגדיר: setNameString newNamesetName
name = newName;
כלומר, למעשה, הכנסנו משתנה חדש newNameוהקצנו אותו למשתנה שכבר קיים במחלקה name. מתכנתים רבים חשבו שזה מוזר להכניס משתנה עם שם חדש אם בסופו של דבר אנחנו מדברים על אותו דבר. לגבי השם בכיתה Human. לכן, מפתחי השפה חשבו לעשות את זה נוח להשתמש בשם משתנה אחד. במילים אחרות, למה יש שני שמות למשתנה שמשמעותו אותו הדבר. כלומר, הייתי רוצה לעשות משהו כזה: מילת מפתח זו {בדוגמאות} - 4אבל במקרה הזה מתעוררת בעיה . כעת יש לנו שני משתנים שנקראים זהים. האחד String nameשייך למחלקה Humanוהשני String nameלשיטתו setName. לכן, מכונת ה-Java לא יודעת לאיזה משתנה אתה מתכוון כשאתה כותב מחרוזת ב-setter:
name = name;
Java לוקח את הקרוב ביותר - nameמהשיטה setName:
מילת מפתח זו {בדוגמאות} - 5
ומסתבר שאתה פשוט מקצה ערך למשתנה nameמהשיטה הזו, אליו. מה שכמובן לא הגיוני. לכן נדרשה דרך כלשהי להבחין בין משתנה nameממחלקה Humanלמשתנה nameמתודה setName.כדי לפתור בעיה זו הוכנסה מילת המפתח this, שבמקרה זה תצביע על כך שיש צורך לקרוא למשתנה לא של מתודה, אלא של כיתה Human:
מילת מפתח זו {בדוגמאות} - 6
כלומר, thisהוא יתייחס לאובייקט הקורא, כפי שנאמר בתחילת המאמר. כתוצאה מכך, שמו של האדם setNameיוגדר דרך המגדיר לאובייקט שנוצר. להלן הקוד ללא שימוש במילת המפתח this. הקוד יוצר אובייקט מחלקה Humanונותן לו שם:
מילת מפתח זו {בדוגמאות} - 7
ולהלן קוד התוכנית עם מילת המפתח 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;
אז אתה סוג של אומר לבנאי עם שלושה פרמטרים:
  • קרא לבנאי זה, שיש לו שני פרמטרים.
  • ולהוסיף את המשתנה החסר.
זה הכל =). לבסוף, נציין שמילת המפתח זה ב-Java משמשת רק כחלק משיטות או בנאים של מופע מחלקה. אבל באופן מרומז, מילת המפתח thisמועברת לכל השיטות למעט סטטיות (ולכן היא thisנקראת לעתים קרובות פרמטר מרומז) וניתן להשתמש בה כדי להתייחס לאובייקט שקרא לשיטה. אין צורך לפחד ממילת המפתח הזו, כי Thisהיא לא מפחידה.
מילת מפתח זו {בדוגמאות} - 9
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION