תחום וגישה
הוצג| English | משמעות |
|---|---|
| local variable/ˈləʊkl ˈveərɪəbl/ | משתנה מקומי |
| scope/skəʊp/ | תחום תוקף |
| shadows/ˈʃædəʊz/ | הצללה |
משתנה מקומי מתאיס; שדה זוכר
- שיצירת
int count = 0;, מגבירה אותו ומחזירה 1. קריאה לשני שיטות זו מחזירה 1 בשתי הפעמים מכיוון שכל התיקוף יש לו משתנה מקומי טרי. - שיטה שמגבירה את השדה של אובייקט מחזירה במקום זאת ↦1 ולאחר מכן ↦2 לאותו אובייקט בעל ערך התחלתי אפס. הבדילו בין המקום בו שם ניתן לשימוש לבין המשך הזמן שבו המצב המוחזר נשמר.
הטווח מתייחס לשם בתוך קוד המקור
- הטווח של הכרזה הוא החלק בתוכנה בו השם שלה יכול לשמש. מקום מקומי נמצא בטווח מההכרזה שלו ועד סוף המקום; משתנה לולאת for אינו זמין לאחר הלולאה.
- טווח, רישוי גישה וחיי משך משיבים לשאלות שונות. שם עשוי להיות מחוץ לטווח גם אם אובייקט שכבר ייחס לפני כן נשאר נגיש דרך ייחוס אחר; שדות אינם נשלטים על ידי אותה הכללת הכרזה כמו מקומיים.
את משתני מקומיים יש להתחיל לפני קריאתם
- משתנה מקומי מוגדר בתוך שיטה או מקום. Java דורשת שהוא יהיה ממויין באופן חד-משמעי לפני שקוראים ממנו ערך;
int x; return x;הוא שגיאת קומפילציה, ולא חזרה אוטומטית לאפס. - שדות אינסטנציה מקבלים ערכים ברירת מחדל במהלך הבנייה לפני שהמחליפים והקוד של הקונסטרוקטור פועלים. בדוגמה, count מתחיל ב-0; שדה זה שייך לכל אובייקט ונשאר קיים בין קריאות השיטה שלו.
public class ScopeCounter {
private int count;
public int localCount() {
int count = 0;
count++;
return count;
}
public int rememberedCount() {
count++;
return count;
}
public void setCount(int count) {
this.count = count;
}
public static int readCount(ScopeCounter other) {
return other.count;
}
}
ההכרזה המקומית int x; מעניקה ל-x באופן אוטומטי את הערך אפס, כך ש-return x; יכול להתקפל.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
חייבים להעניק ערך למשתנים מקומיים לפני קריאתם; ברירת מחדל של שדות אינה חלה על משתנים מקומיים.
פרמטר יכול להסתיר שם של שדה
- הפרמטר
countבsetCount(int count)מצלל את השדה עבור שימוש ללא סיומת שם.count = count;תעביר ערך לפרמטר עצמו;this.count = count;מעדכן את השדה של המקבל. - משתנה מקומי יכול גם הוא לצלל שדה, כפי שמדגים localCount. אל תניחו שכל הכרזה חוזרת של משתנה מקומי מותרת: הכרזה חוזרת של משתנה מקומי שנמצא כבר בתחום הסיבוי (in-scope) בבלוק פנימי באותה מתוד היא שגיאת compilation.
התחום של משתנה הוא...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
התחום הוא המקום בו השם תקף.
לאחר שהזמנת מתודה רגילה הסתיימה, האם המכנה יכול להשתמש במשתנה מקומי שהוכרז רק בתוך המתודה על ידי שמה המקומי?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
השם המקומי אינו בטווח התוקף של המכנה. אובייקט המיוחס על ידי שם זה יכול עם זאת להיות מוחזר ולשאר נגיש.
איזה סוג של משתנה צריך לשמור על מצב שאובייקט חייב לזכור בין קריאות שיטה?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
משתני אינסטנציה נשארים קיימים לאורך חיי האובייקט.
פרמטר בעל אותו שם כמו משתנה אינסטנציה מוסך (מסתיר) את משתנה האינסטנציה בתוך השיטה.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
בתוך המטודה, השם מתייחס לפרמטר; השתמש ב-⟦this⟦ כדי לגשת לשדה.
כאשר פרמטר מסתיר משתנה אובייקט בעל אותו שם, נאמר כי הוא ⟦מצל⟦ אותו (מילה אחת).
Difficulty 1/5 · 100 coins + a small bonus on first completion today
הצללה מסתירה את השדה מאחורי השם המקומי.
גישה ל תלויה בכיתת המכריזה
- קוד בתוך ScopeCounter יכול לקרוא count פרטי של אובייקט ScopeCounter אחר דרך רפרנס מפורש. המתוד הקבועה readCount המוצגת אינה מכילה
this, אךother.countתקף עבור פרמטר שאינו null. - כיתה חיצונית זרה לא יכולה לקרוא ישירות לשדה הפרטי הזה. גישה פרטית אינה מוגבלת ל"רק האובייקט שלי"; מתוד instance מכילה מקבל (receiver) אימפליציטי, בעוד שמתוד static צריכה רפרנס מפורש לגשת למצב instance.
אל תשלבו בין תחום שם, התחלת ערך ברירת מחדל וגישה פרטית לכלל אחד. משתנה מקומי אינו מתחיל אוטומטית מאפס, שדה instance לא ניתן לקריאה ללא סיומת שם מתוך מתוד static, ושדה פרטי של instance אחר ניתן לגישה בתוך הכיתה המכריזה שלו.
טווח תוקף, מצב שדה ורישוי גישה
להבין בין הכרזות לבין הקשר הגישה; אובייקט נוסף אינו חסום באופן אוטומטי.
המתודה הסטטית readCount המוצגת יכולה לקרוא other.count כאשר other אינו null.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
היא משתמשת ביחוס אובייקט מפורש ונמצאת בתוך המחלקה שמכריזה על השדה ה-private; אין צורך ב-this אימפליסיטי.
לחזות מקבל חדש ואובייקט מוחזר
- לאחר שתי קריאות לrememberedCount על a, השדה שלו הוא 2; b שנבנה זה-רגע עדיין יש לו count 0. קריאה לa.localCount() מחזירה 1 ללא איפוס השדה של a, כי count המקומי שלה מצלל את השדה.
- מתוד יכולה לבנות אובייקט במשתנה מקומי ולהחזיר את הרפרנס שלו. השם המקומי אז אינו זמין לקורא, אך האובייקט שהוחזר יכול להישאר נגיש; סוף תחום הסיבוי של שם אינו מזהיר את האובייקט.
תחום הסיבוי (Scope) אומר היכן שם可用; מודפי גישה מבקרים רשות; מצב אובייקט יכול להתמשך מעבר לרפרנס מקומי. אתרו משתנים מקומיים לפני קריאה מהם, השתמשו בשדות למצב נשמר לפי אובייקט, והבדילו בין צלילה (shadowing) לבין גישה לשדה פרטי של אובייקט אחר.
עבור ScopeCounter a שנבנה חדש, קרא a.rememberedCount() פעמיים, ולאחר מכן a.localCount(). מה a.localCount() מחזיר?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
ל-localCount יש ספירה מקומית טרייה המוגדרת לאפס; היא מגבירה ומחזירה 1 ללא שינוי בשדה.