CodeGym /בלוג Java /Random-HE /Java מילת מפתח זו
John Squirrels
רָמָה
San Francisco

Java מילת מפתח זו

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

דוגמה 1: משתנה מופע ומשתנה מתודה בעלי אותו שם.

נניח שיש לנו מחלקה Human שמגדירה שדה שם: בוא ניצור מגדיר עבור משתנה השם (המגדיר פונקציונלי לחלוטין - אין כאן מלכוד):
class Human {
    String name;


    public void setName(String newName) {
        name = newName;
    }
}
שימו לב שאנו מעבירים את String newName למתודה setName setter. הכרזנו על משתנה חדש ויכולנו לקרוא לו איך שרצינו כי הוא יהיה גלוי רק בתוך הסוגרים המתולתלים ({}) המקיפים את שיטת setName . שימו לב שלמגדיר יש קו בודד:
name = newName;
כאן הצגנו משתנה חדש בשם newName והקצינו אותו למשתנה השם הקיים של האובייקט . מתכנתים רבים עשויים למצוא את זה מוזר להציג משתנה עם שם חדש כאשר בסופו של דבר אנחנו מדברים על אותו דבר. כלומר, אנחנו מדברים על שדה השם בכיתה Human . זו הסיבה שיוצרי Java מצאו דרך להשתמש בנוחות באותו שם משתנה. במילים אחרות, למה יש שני שמות למשתנה המציינים את אותו הדבר. במילים אחרות, אנחנו רוצים לעשות משהו כזה:
class Human {
    String name;


    public void setName(String name) {
        name = name;
    }
}
אבל כאן אנו נתקלים בבעיה . כעת יש לנו שני משתנים בעלי אותו שם. שם מחרוזת אחד שייך למחלקה Human , ואילו שם המחרוזת השני שייך לשיטת setName שלה . כתוצאה מכך, ה-JVM לא יידע לאיזה משתנה אתה מתכוון כשאתה כותב את השורה הבאה ב-setter:
name = name;
ג'אווה מניחה שאתה מתכוון למשתנה השם הקרוב ביותר , כלומר זה משיטת setName : מילת המפתח הזו (עם דוגמאות) - 3אז מסתבר שאתה פשוט מקצה את משתנה השם של השיטה לעצמה. מה שכמובן לא הגיוני. לכן, השפה הייתה צריכה דרך כלשהי להבחין בין משתנה השם של המחלקה Human לבין משתנה השם בשיטת setName . בעיה זו נפתרה על ידי הצגת מילת המפתח this , אשר במקרה זה מציינת שאתה מתכוון להתייחס למשתנה המשויך למופע של המחלקה Human , ולא למשתנה בשיטה: במילים אחרות, זה מתייחס לאובייקט הקורא, כמו הזכרנו בתחילת המאמר. כתוצאה מכך, שיטת setName מגדירה את שמו של האדם על האובייקט שנוצר. להלן קוד התוכנית ללא שימוש במילת מפתח זו . הקוד יוצר אובייקט אנושי ומקצה לו שם: והנה הקוד עם מילת המפתח הזו : מילת המפתח הזו (עם דוגמאות) - 4מילת המפתח הזו (עם דוגמאות) - 5
public class Solution {
    public static void main(String[] args) {
        Human human1 = new Human();
        human1.setName("Vinny");
        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);
    }
}
לפיכך, זה מאפשר לנו להימנע מהכנסת משתנים חדשים לציון אותו הדבר, מה שהופך את הקוד לנקי יותר ופחות עמוס במשתנים נוספים.

דוגמה 2: שימוש בזה עבור קריאת בנאי מפורשת

קריאה של בנאי אחד מהאחר יכולה להיות שימושית כאשר יש לך (באופן מוזר) מספר בנאים ואתה לא רוצה שהבנאי החדש ישכפל קוד אתחול שנכתב בעבר בבנאי אחר. מְבוּלבָּל? זה לא כל כך מפחיד כמו שזה נראה. תסתכל על הקוד למטה. יש לו שני בנאים למחלקה 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) {
        // Call the constructor with two parameters
        this(age, weight);
        // and then initialize 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 then initialize the missing variable:
this.height = height;
זה כאילו אנחנו אומרים לבנאי שלושת הפרמטרים:
  • קרא לבנאי אחר שיש לו שני פרמטרים
  • ולאחר מכן הוסף משתנה נוסף.
זה הכל =). לבסוף, נציין שב-Java מילת המפתח הזו משמשת רק בשיטות ובבנאים. אבל זה מועבר באופן מרומז לכל השיטות הלא סטטיות (לכן זה נקרא לעתים קרובות פרמטר מרומז) וניתן להשתמש בו כדי להתייחס לאובייקט שקרא לשיטה. אל תפחד ממילת המפתח הזו, כי זה לא מפחיד.
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION