this
והן
super
שתי מילות מפתח מיוחדות ב-Java המייצגות את המופע הנוכחי של מחלקה ו- superclass שלה, בהתאמה. מתכנתי Java לעתים קרובות מבלבלים את המילים הללו ומפגינים מודעות מועטה למאפיינים המיוחדים שלהם, עליהם נשאלים לעתים קרובות בראיונות Java Core. לדוגמה, כמה שאלות שעולות מיד לראש הן לגבי
this
ו
super
, האם ניתן להקצות משמעות שונה למילת מפתח
this
ב-Java? ומה ההבדל בין מילות מפתח
this
ל-
super
Java. לא יודע? ובכן, אני לא נותן כאן את התשובה - ניתן למצוא אותה בסוף המאמר.
אז, כפי שאמרתי בהתחלה, ההבדל העיקרי בין
this
וב-
super
Java הוא
this
שהמופע הנוכחי של מחלקה מייצג, בעוד
super
שהמופע הנוכחי של מחלקת האב מייצג. הנה דוגמה אחת לשימוש במשתנים
this
ו-
super
בטח כבר ראיתם דוגמאות של קריאה לבנאים של אחד מהשני, מה שנקרא. קורא לבנאים בשרשרת, זה אפשרי באמצעות מילות מפתח
this
ו-
super
. בתוך מחלקה, כדי לקרוא לבנאי ללא ארגומנט שלה, נעשה שימוש
this()
, בעוד
super()
שהוא משמש לקריאה לבנאי ללא ארגומנט, או כפי שהוא נקרא גם, בנאי ברירת המחדל של מחלקת האב. אגב, בדרך זו ניתן לקרוא לא רק לבנאי ללא ארגומנטים, אלא גם לכל בנאי אחר על ידי העברת הפרמטרים המתאימים לו. בקרוב נראה דוגמה
this
לשימוש זה
super
. גם ב-
this
Java
super
הם משמשים לגישה למשתנים של מופע מחלקה והאב שלו. למעשה, ניתן לגשת אליהם ללא הקידומות
super
ו
this
, אבל רק אם בבלוק הנוכחי משתנים כאלה אינם חופפים למשתנים אחרים, כלומר. אם הוא לא מכיל משתנים מקומיים עם אותם שמות, אחרת תצטרך להשתמש בשמות עם קידומות, אבל זה לא משנה, כי בצורה זו הם קריאים אפילו יותר. דוגמה קלאסית לגישה זו היא להשתמש בה
this
בתוך בנאי שלוקח פרמטר בעל שם זהה למשתנה המופע. בהמשך המאמר נגלה אילו הבדלים נוספים יש בין
super
לבין
this
, ונסתכל על כמה דוגמאות לשימוש בהם.
איך זה וסופר דומים
לפני שנסתכל על ההבדלים בין מילות מפתח
this
ו-
super
, בואו נסתכל על כמה מהדמיון ביניהם:
- שניהם
this
וגם super
משתנים לא סטטיים, כך שלא ניתן להשתמש בהם בהקשר סטטי, מה שאומר שלא ניתן להשתמש בהם בשיטה הראשית. זה יגרום לשגיאה בזמן הידור " this
לא ניתן להתייחס למשתנה לא סטטי מהקשר סטטי". אותו דבר קורה אם אתה משתמש במילת המפתח בשיטה הראשית super
.
- שניהם
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("");
System.out.println("Конструктор без аргументов класса B");
}
B(String args){
super("");
System.out.println("Конструктор с одним аргументом класса B");
}
}
public class Test {
public static void main(String args[]) {
B b = new B();
}
}
פלט: בנאי ארגומנט אחד של מחלקה A בנאי ארגומנט אחד של מחלקה B בנאי ללא ארגומנט של מחלקה B
- בתוך הבנאי
this
, וחייב super
להופיע מעל כל הביטויים האחרים, ממש בהתחלה, אחרת המהדר יוציא הודעת שגיאה. מכאן נובע שבנאי אחד לא יכול להכיל גם this()
וגם super()
.
הבדלים בין סופר לזה
כעת אנו יודעים כיצד להשתמש במילות מפתח
super
ולהבין
this
מדוע יש צורך בהן. אבל ישנה אפשרות נוספת לשימוש במילות המפתח הללו שלא הזכרתי - במחלקות Inner, שבהן בעזרתן מאוד נוח להתייחס למחלקה חיצונית באמצעות טופס הסימון Outer.
this
עבור המופע הנוכחי שלו ו-Oter.
super
- להורה שלו. אל תשכח להחליף את Outer בשם של המחלקה החיצונית. כעת נפרט בקצרה את ההבדלים העיקריים בין מילות מפתח
this
ו
super
- משתנה
this
מתייחס למופע הנוכחי של המחלקה שבה הוא משמש, ואילו הוא super
מתייחס למופע הנוכחי של מחלקת האב.
- כל בנאי, בהיעדר קריאות מפורשות לבנאים אחרים, קורא באופן מרומז
super()
לבנאי ללא ארגומנט של מחלקת האב שלו, אבל תמיד יש לך את האפשרות לקרוא במפורש לכל בנאי אחר עם או this()
או super()
.
זה כנראה כל מה שניתן לומר על ההבדלים בין מילות מפתח
this
וב-
super
Java וכיצד הם משמשים בתוכניות. כפי שראינו, המטרה העיקרית שלהם היא לקרוא לבנאי אחד מהאחר ולהתייחס למשתני מופע שהוכרזו במחלקה הנוכחית ובמחלקת האב שלה. אל תשכח שאלו לא בדיוק משתנים רגילים, ועכשיו - התשובה לשאלה שלי, ששאלתי בפסקה הראשונה. לא,
this
לא ניתן להקצות למשתנה ערך חדש מכיוון שהוא מוכרז כסופי. אתה יכול לנסות לעשות זאת ב-IDE - תקבל שגיאת קומפילציה "אי אפשר להקצות ערך חדש למשתנה
this
- הוא מוכרז כסופי".
מאמר מקורי כאן .
GO TO FULL VERSION