משתני מופע לעומת משתנים סטטיים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 15 מתוך 87.
עד כה, כל שדה שיצרנו שייך לאובייקט מסוים. לכל BankAccount יש balance משלו, ולכל Product יש name משלו. אלה משתני מופע — הם קיימים בנפרד עבור כל מופע של מחלקה.
אבל מה אם דרושים לך נתונים שמשותפים לכל האובייקטים? כאן נכנסים לתמונה משתנים סטטיים (שנקראים גם משתני מחלקה). משתנה סטטי שייך למחלקה עצמה, ולא לאובייקט מסוים.
public class Student {
private String name; // משתנה מופע - ייחודי לכל תלמיד
private static int totalCount; // משתנה סטטי - משותף לכל התלמידים
public Student(String name) {
this.name = name;
totalCount++; // מגדיל את המונה המשותף
}
public static int getTotalCount() {
return totalCount;
}
}כשיוצרים כמה תלמידים, לכל אחד מהם יש name משלו, אבל כולם חולקים את אותו totalCount:
Student s1 = new Student("Alice");
Student s2 = new Student("Bob");
System.out.println(Student.getTotalCount()); // פלט: 2שימו לב כיצד אנחנו ניגשים למשתנה הסטטי דרך שם המחלקה (Student.getTotalCount()) ולא דרך אובייקט. כך מודגש שחברים סטטיים שייכים למחלקה, ולא למופעים שלה.
השתמש במשתני מופע עבור נתונים שמשתנים בין אובייקטים (כמו שם של תלמיד). השתמש במשתנים סטטיים עבור נתונים שצריכים להיות משותפים (כמו ספירת מספר האובייקטים הקיימים).
אתגר
קלבואו נבנה מערכת לניהול מלאי של ספרי Book, שעוקבת הן אחר הפרטים של כל ספר בנפרד והן אחר המספר הכולל של הספרים באוסף כולו, באמצעות משתני מופע ומשתנים סטטיים.
תיצרו שני קבצים כדי לארגן את הקוד שלכם:
Book.java: צרו מחלקה בשם Book שעוקבת אחר מידע על כל ספר בנפרד, ובמקביל גם סופרת את כל הספרים שנוצרו אי פעם:- משתנה מופע
title(String) — ייחודי לכל ספר - משתנה מופע
price(double) — ייחודי לכל ספר - משתנה סטטי
totalBooks(int) — משותף לכל אובייקטי Book, ועוקב אחר מספר הספרים שנוצרו - בנאי שמקבל את הכותרת ואת המחיר, ומגדיל את המספר הכולל של הספרים
- פעולת getter בשם
getTitle()עבור הכותרת - פעולת getter בשם
getPrice()עבור המחיר - מתודה סטטית
getTotalBooks()שמחזירה את המספר הכולל של הספרים שנוצרו
- משתנה מופע
Main.java: צרו כמה אובייקטים של Book והדגימו כיצד המונה הסטטי עוקב אחר כל המופעים. תקבלו כקלט שלוש כותרות של ספרים ושלושה מחירים. לאחר יצירת כל שלושת הספרים, הדפיסו ארבע שורות:- הכותרת והמחיר של כל ספר בפורמט:
[title]: $[price](המחיר מעוצב עם 2 ספרות אחרי הנקודה העשרונית) - המספר הכולל של הספרים באמצעות המתודה הסטטית:
Total books: [count]
- הכותרת והמחיר של כל ספר בפורמט:
תקבלו שישה קלטים לפי הסדר: title1, price1, title2, price2, title3, price3.
זכרו לגשת למתודה הסטטית דרך שם המחלקה (Book.getTotalBooks()) ולא דרך מופע של אובייקט. לעיצוב המחירים, השתמשו ב-String.format("%.2f", price).
נסו בעצמכם
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// קראו את הקלט עבור שלושה ספרים
String title1 = scanner.nextLine();
double price1 = Double.parseDouble(scanner.nextLine());
String title2 = scanner.nextLine();
double price2 = Double.parseDouble(scanner.nextLine());
String title3 = scanner.nextLine();
double price3 = Double.parseDouble(scanner.nextLine());
// TODO: צרו שלושה אובייקטים מסוג Book באמצעות הקלט שלמעלה
// TODO: הדפיסו את הכותרת והמחיר של כל ספר בפורמט: [title]: $[price]
// השתמשו ב-String.format("%.2f", price) כדי לעצב את המחיר עם 2 ספרות אחרי הנקודה העשרונית
// TODO: הדפיסו את מספר הספרים הכולל באמצעות המתודה הסטטית
// פורמט: Total books: [count]
// זכרו לגשת למתודה הסטטית דרך שם המחלקה: Book.getTotalBooks()
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמבוא לתכנות מונחה עצמיםמחלקות לעומת אובייקטיםמילת המפתח thisמתודותשדות (מאפיינים)מתודת הבנאיהעמסת בנאיםחזרה – מחשבון פשוט4ירושה
ירושה בסיסית (extends)מילת המפתח superדריסת מתודות (@Override)שרשור בנאיםהמחלקה Objectירושה יחידה ורב־רמתיתלמה אין ירושה מרובה של מחלקותסיכום – היררכיית עובדים7מתודות מיוחדות ומחלקת Object
מתודת toString()equals() ו-hashCode()מתודת clone()compareTo() ו-Comparableהממשק Comparatorסיכום – מיון מותאם אישית2מצייני גישה ואנקפסולציה
סקירה של רמות הגישהמתודות Getter ו-Setterהסתרת מידעמילת המפתח finalסיכום – מנהל חשבון בנק5פולימורפיזם
יסודות העמסת מתודותדריסת מתודות (בזמן ריצה)המרה כלפי מעלה וכלפי מטההאופרטור instanceofמחלקות ומתודות מופשטותסיכום – מחשבון צורות8מושגי OOP מתקדמים
הרכבה מול ירושהאגרגציה מול הרכבהמחלקות פנימיות, מקוננות ואנונימיותEnums ומתודות של EnumRecords (Java 16+)מחלקות חתומות (Java 17+)3מאפייני מחלקה וחברים סטטיים
משתני מופע לעומת משתנים סטטייםמתודות סטטיותבלוקים סטטייםקבועים (static final)סיכום — מונה ומחלקת עזר6ממשקים ומחלקות מופשטות
מבוא לממשקיםמימוש ממשקיםמימוש של כמה ממשקיםמתודות ברירת מחדל וסטטיות בממשקמחלקות מופשטות לעומת ממשקיםממשקים פונקציונלייםסיכום – מערכת תשלומיםתרגלו בעצמכם: קומפיילר Java אונליין