JavaRush /בלוג Java /Random-HE /ההבדל בין מילות מפתח זה למילות מפתח ב-Java
grishin
רָמָה
Харьков

ההבדל בין מילות מפתח זה למילות מפתח ב-Java

פורסם בקבוצה
thisוהן superשתי מילות מפתח מיוחדות ב-Java המייצגות את המופע הנוכחי של מחלקה ו- superclass שלה, בהתאמה. מתכנתי Java לעתים קרובות מבלבלים את המילים הללו ומפגינים מודעות מועטה למאפיינים המיוחדים שלהם, עליהם נשאלים לעתים קרובות בראיונות Java Core. לדוגמה, כמה שאלות שעולות מיד לראש הן לגבי thisו super, האם ניתן להקצות משמעות שונה למילת מפתח thisב-Java? ומה ההבדל בין מילות מפתח thisל- superJava. לא יודע? ובכן, אני לא נותן כאן את התשובה - ניתן למצוא אותה בסוף המאמר. ההבדל בין מילות מפתח זה למילות מפתח ב-Java - 1אז, כפי שאמרתי בהתחלה, ההבדל העיקרי בין thisוב- superJava הוא thisשהמופע הנוכחי של מחלקה מייצג, בעוד superשהמופע הנוכחי של מחלקת האב מייצג. הנה דוגמה אחת לשימוש במשתנים thisו- superבטח כבר ראיתם דוגמאות של קריאה לבנאים של אחד מהשני, מה שנקרא. קורא לבנאים בשרשרת, זה אפשרי באמצעות מילות מפתח thisו- super. בתוך מחלקה, כדי לקרוא לבנאי ללא ארגומנט שלה, נעשה שימוש this(), בעוד super()שהוא משמש לקריאה לבנאי ללא ארגומנט, או כפי שהוא נקרא גם, בנאי ברירת המחדל של מחלקת האב. אגב, בדרך זו ניתן לקרוא לא רק לבנאי ללא ארגומנטים, אלא גם לכל בנאי אחר על ידי העברת הפרמטרים המתאימים לו. בקרוב נראה דוגמה thisלשימוש זה super. גם ב- thisJava superהם משמשים לגישה למשתנים של מופע מחלקה והאב שלו. למעשה, ניתן לגשת אליהם ללא הקידומות superו this, אבל רק אם בבלוק הנוכחי משתנים כאלה אינם חופפים למשתנים אחרים, כלומר. אם הוא לא מכיל משתנים מקומיים עם אותם שמות, אחרת תצטרך להשתמש בשמות עם קידומות, אבל זה לא משנה, כי בצורה זו הם קריאים אפילו יותר. דוגמה קלאסית לגישה זו היא להשתמש בה thisבתוך בנאי שלוקח פרמטר בעל שם זהה למשתנה המופע. בהמשך המאמר נגלה אילו הבדלים נוספים יש בין superלבין this, ונסתכל על כמה דוגמאות לשימוש בהם.

איך זה וסופר דומים

לפני שנסתכל על ההבדלים בין מילות מפתח thisו- super, בואו נסתכל על כמה מהדמיון ביניהם:
  1. שניהם thisוגם superמשתנים לא סטטיים, כך שלא ניתן להשתמש בהם בהקשר סטטי, מה שאומר שלא ניתן להשתמש בהם בשיטה הראשית. זה יגרום לשגיאה בזמן הידור " thisלא ניתן להתייחס למשתנה לא סטטי מהקשר סטטי". אותו דבר קורה אם אתה משתמש במילת המפתח בשיטה הראשית super.

  2. שניהם thisוגם superיכולים לשמש בתוך בנאים כדי לקרוא לבנאים אחרים בשרשרת, למשל, this() ו- super() קוראים לבנאי ללא טיעונים של מחלקות הירושה והאב, בהתאמה.
בדוגמה להלן, אנו מעבירים תחילה קריאה מבנאי ללא ארגומנט של מחלקה B לבנאי מאותה מחלקה B שלוקח פרמטר בודד מסוג String, אשר בתורו super("")קורא לבנאי ארגומנט אחד ממחלקת העל.
class A{

    A(){
        System.out.println("Конструктор без аргументов класса A");
    }

    A(String args){
        System.out.println("Конструктор с одним аргументом класса A");
    }
}

class B extends A{

   B(){
        this(""); // вызов конструктора с одним аргументом класса B
        System.out.println("Конструктор без аргументов класса B");
    }

   B(String args){
        super(""); // вызов конструктора с одним аргументом класса A
        System.out.println("Конструктор с одним аргументом класса B");
    }
}

// Тест-класс и вывод
public class Test {

    public static void main(String args[]) {
       B b = new B();
    }

}
פלט: בנאי ארגומנט אחד של מחלקה A בנאי ארגומנט אחד של מחלקה B בנאי ללא ארגומנט של מחלקה B
  1. בתוך הבנאי this, וחייב superלהופיע מעל כל הביטויים האחרים, ממש בהתחלה, אחרת המהדר יוציא הודעת שגיאה. מכאן נובע שבנאי אחד לא יכול להכיל גם this()וגם super().

הבדלים בין סופר לזה

כעת אנו יודעים כיצד להשתמש במילות מפתח superולהבין thisמדוע יש צורך בהן. אבל ישנה אפשרות נוספת לשימוש במילות המפתח הללו שלא הזכרתי - במחלקות Inner, שבהן בעזרתן מאוד נוח להתייחס למחלקה חיצונית באמצעות טופס הסימון Outer. thisעבור המופע הנוכחי שלו ו-Oter. super- להורה שלו. אל תשכח להחליף את Outer בשם של המחלקה החיצונית. כעת נפרט בקצרה את ההבדלים העיקריים בין מילות מפתח thisוsuper
  1. משתנה thisמתייחס למופע הנוכחי של המחלקה שבה הוא משמש, ואילו הוא superמתייחס למופע הנוכחי של מחלקת האב.

  2. כל בנאי, בהיעדר קריאות מפורשות לבנאים אחרים, קורא באופן מרומז super()לבנאי ללא ארגומנט של מחלקת האב שלו, אבל תמיד יש לך את האפשרות לקרוא במפורש לכל בנאי אחר עם או this()או super().
זה כנראה כל מה שניתן לומר על ההבדלים בין מילות מפתח thisוב- superJava וכיצד הם משמשים בתוכניות. כפי שראינו, המטרה העיקרית שלהם היא לקרוא לבנאי אחד מהאחר ולהתייחס למשתני מופע שהוכרזו במחלקה הנוכחית ובמחלקת האב שלה. אל תשכח שאלו לא בדיוק משתנים רגילים, ועכשיו - התשובה לשאלה שלי, ששאלתי בפסקה הראשונה. לא, thisלא ניתן להקצות למשתנה ערך חדש מכיוון שהוא מוכרז כסופי. אתה יכול לנסות לעשות זאת ב-IDE - תקבל שגיאת קומפילציה "אי אפשר להקצות ערך חדש למשתנה this- הוא מוכרז כסופי". מאמר מקורי כאן .
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION