Menu
Coddy logo textTech

משתני מופע לעומת משתנים סטטיים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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()) ולא דרך אובייקט. כך מודגש שחברים סטטיים שייכים למחלקה, ולא למופעים שלה.

השתמש במשתני מופע עבור נתונים שמשתנים בין אובייקטים (כמו שם של תלמיד). השתמש במשתנים סטטיים עבור נתונים שצריכים להיות משותפים (כמו ספירת מספר האובייקטים הקיימים).

challenge icon

אתגר

קל

בואו נבנה מערכת לניהול מלאי של ספרי 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()
    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Java אונליין