משתני מחלקה ושיטות
הוצג| English | משמעות |
|---|---|
| static variable/ˈstætɪk ˈveərɪəbl/ | משתנה סטטי |
| static method/ˈstætɪk ˈmeθəd/ | שיטה סטטית |
שני אובייקטים, ספירת בנייה אחת
- אדה ובו יש להם נקודות נפרדות, אך יצירת כל סטודנט מוסיפה לאותו משתנה סטטי,
Student.count. לאחר שתי בנייות, הספירה היא 2; שינוי הנקודות של אדה אינו משנה את נקודותיו של בו. - השוו מה שכל ערך מתאר: נקודה מתארת סטודנט אחד, בעוד שהמונה הזה מתאר בנייות של המחלקה. ייחוס מועתק של אדה אינו יוצר אובייקט חדש ואינו מגביר את המונה.
מיקום כל שדה ברמה הנכונה
- שדה מסד יש לו מקום אחסון נפרד בכל אובייקט. שדה סטטי יש לו מקום אחסון אחד עבור המחלקה הטעונה הזו, גם לפני שכל אובייקטים נבנו;
privateשולט בגישה, לא במספר העותקות. - לדוגמה קטן וחד-סיבי זה, הקונסטרוקטור מגביר את
countפעם אחת לכל בנייה. הוא סופר אובייקטים שנבנו, לא אובייקטים שעדיין חיים: אובדן ייחוס אינו מפחית אותו אוטומטית.
class Student {
private int score;
private static int count = 0;
public Student(int initialScore) {
score = initialScore;
count++;
}
public int getScore() { return score; }
public void setScore(int newScore) { score = newScore; }
public static int getCount() { return count; }
public static int readScore(Student s) { return s.score; }
}
ספנית סטטית משותפת אחת
count היא ערך משותף אחד, בבעלות המחלקה.
משתנה סטטי (של מחלקה) הוא...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
סטטי מתאר העתק משותף אחד בבעלות המחלקה.
אם הקונסטרוקטור מבצע count++ והצ'אטר מתחיל ב-0, מה תהיה ערך count לאחר יצירת 3 אובייקטים?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
כל בנייה מגדילה את הספירה המשותפת → 3.
מטהוד סטטי אין לו מקבל
- מטהוד סטטי אין לו אובייקט נוכחי מוסתר, ולכן הוא לא יכול להשתמש ב-
thisאו בשדה מסד ללא-תואם כמוscore.getCount()יכול לקרוא ל-countכי שדה זה שייך למחלקה. - סטטי לא אוסר על עבודה עם אובייקטים.
readScore(Student s)מקבל ייחוס אובייקט מפורש וקורא ל-s.score; הוא בתוךStudent, שבו גישה לשדה פרטי זה מותרת. כאןsחייב להיות אינו-נוול.
return score; בתוך מטהוד סטטי הוא טעות קומפילציה במחלקה זו. return s.score; בתוך מטהוד הסטטי המוצג הוא תקף: הייחוס מזהה את נקודתו של איזה סטודנט לקרוא.
בתוך כיתה Student המוצגת, שיטה סטטית יכולה להשתמש בreturn score; ללא ציון כל אובייקט Student.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
שגוי: score הוא שדה אינסטנץ ושיטה סטטית זו אין לה מקבל (receiver) מפורש. עם פרמטר s מסוג Student שאינו null, return s.score; תקין בתוך Student.
בתוך Student, איזה מתוד סטטי יכול לקרוא את ה-score של פרמטר s שאינו null?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
היחוס המפורש s מזהה את האובייקט; Student עצמו עשוי לגשת לשדה ה-private score.
סימול שיחות מחלקה ואובייקט
- לאחר
Student a = new Student(50);ו-Student b = new Student(75);,Student.getCount()הוא 2,a.getScore()הוא 50 ו-b.getScore()הוא 75.a.setScore(60)משנה רק את נקודותיה של אדה. Student.readScore(a)מחזיר אז ↦60 ללא בניית סטודנט נוסף. השיטה היא סטטית, אך הפרמטר המפורש שלה מזהה אובייקט קיים שמצב זה קורא.
שיטת אינסטנציה כמו getScore() נקראת על...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
חברי אינסטנציה פועלים על אובייקט ספציפי.
הפרד בין סינטקס חוקי לבין סגנון ברור
- עדיף להשתמש ב-
Student.getCount()כדי להראות שהשיטה שייכת לקלאס. Java מאפשרת גםa.getCount()עבור שיטה סטטית זו; סינטקס זו אינה הופכת את הספירה לספציפית לאדה. a.getScore()היא קריאת אינסטנציה עם אדה כמקבל.Student.getScore()אינו תקון כאן מכיוון שהשיטה דורשת אובייקט ואינה סטטית; בחרו בסוגי השדות והשיטות בהתאם למשימותיהן.
איזה קריאה מדגימה בצורה הטובה ביותר כי COUNT() היא שיטה סטטית של Student?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Student.getCount() מציין את השם של הכיתה בבירור. Java מאפשרת גם student.getCount() לשיטה סטטית, אך כתיבה זו מטשטשת את המשמעות הרמה-כיתה שלה.
תחזו העתק ייחוס (Reference Copy)
- החל משני הסטודנטים שנבנו,
Student alias = a;משאיר את ספירת הבנייה ב-2.alias.setScore(90)משנה את האובייקט הקיים של אדה, ולכןa.getScore()הוא 90 ונקודותיו של בוי נשארים ב-75. - ספרו את ביצועי
new Student(...), ולאחר מכן עקבו אחר מצב כל אובייקט בנפרד. לא קריאת אקססור וא assignment ייחוס יוצרים סטודנט, ושיטה סטטית עדיין יכולה לקרוא אובייקט מסופק במפורש.
שדות סטטיים מאחסנים מצב קלאס; שדות אינסטנציה מאחסנים מצב אובייקט. לשיטות סטטיות אין this, אך הן יכולות להשתמש בייחוסים לאובייקטים מפורשים. עדיפו על קריאות סטטיות מוסמכות בקלאס והבדילו בין ספירות בנייה לספירות אובייקטים פעילים.
נבנו שני סטודנטים, לכן count שווה ל-2. לאחר מכן Student alias = a; וalias.setScore(90); run. מהי Student.getCount()?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
גם הצבת ייחוס וגם שינוי ציון אינם מבצעים את הבונה. ה-count נשאר 2.
מדד הבנייה (constructor counter) הזה יורד אוטומטית כאשר יחוס לתלמיד מאבד.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
רק קוד שמעריך את count משנה אותו. דוגמה זו סופרת בניות ואינה מספקת הפחתה.