Smart-World Surf

יחידה 3: מחלקות ושיטות מתקדמות

הרחבת הידע על שימוש במחלקות, חברי מחלקה סטטיים וקלט/פלט.

ברוכים הבאים ליחידת הלימוד "מחלקות ושיטות מתקדמות" בקורס "מבוא למדעי המחשב ושפת Java". יחידה זו מרחיבה את הידע שלכם בשימוש במחלקות ובשיטות, ומעמיקה בנושאים קריטיים לפיתוח תוכנה מודרנית ויעילה ב-Java. נתמקד בהבנת חברי מחלקה סטטיים, קלט/פלט בסיסי, טיפול נכון בהפניות לאובייקטים, ושיטות נפוצות כמו toString(), תוך מתן דגש על נושאים בעלי חשיבות לבחינה.

חברי מחלקה סטטיים: שיתוף ושימושיות

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

שדות סטטיים (Static Fields)

שדה סטטי הוא משתנה השייך למחלקה וקיים רק פעם אחת בזיכרון, ללא קשר למספר המופעים שנוצרו מהמחלקה. כל המופעים חולקים את אותו שדה סטטי.

שדה סטטי: משתנה השייך למחלקה, משותף לכל מופעיה, וקיים פעם אחת בזיכרון.
  • שימושים נפוצים: מונים (לדוגמה, כמה אובייקטים נוצרו), קבועים גלובליים (לדוגמה, Math.PI), או משאבים משותפים.

שיטות סטטיות (Static Methods)

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

שיטה סטטית: שיטה השייכת למחלקה, ניתנת לקריאה ללא יצירת מופע, ואינה יכולה לגשת לחברי מופע.
  • שימושים נפוצים: שיטות עזר (utility methods) שאינן דורשות מצב אובייקט (לדוגמה, Math.max()), או שיטות המבצעות פעולות כלליות הקשורות למחלקה אך לא למופע ספציפי.
הבחנה בין סטטי למופע: זוהי נקודה קריטית לבחינה! שיטה סטטית אינה פועלת על אובייקט ספציפי ולכן אינה יכולה להשתמש במילה השמורה this או לגשת לשדות/שיטות שאינם סטטיים של המחלקה. לעומת זאת, שיטת מופע (שאינה סטטית) פועלת על אובייקט ספציפי ויכולה לגשת לכל חברי המחלקה (סטטיים ולא סטטיים). טעויות נפוצות כוללות ניסיון לגשת לשדה מופע מתוך שיטה סטטית.

קלט/פלט בסיסי וייצוג אובייקטים: Scanner ו-toString()

אינטראקציה עם המשתמש וייצוג קריא של אובייקטים הם חלקים בלתי נפרדים מפיתוח תוכנה.

קלט ממשתמש עם Scanner

המחלקת Scanner מספקת דרך נוחה לקרוא קלט מסוגים שונים (מספרים, מחרוזות וכו') ממקורות שונים, לרוב מקלט המקלדת (System.in).

Scanner: מחלקה ב-Java המשמשת לקריאת קלט מפורמט מתוך מקורות שונים, כגון קלט המקלדת.
  • שימוש בסיסי: יצירת אובייקט Scanner (לדוגמה: Scanner scanner = new Scanner(System.in);), ולאחר מכן שימוש בשיטות כמו nextInt(), nextDouble(), next(), nextLine() לקריאת נתונים.
  • חשיבות: יש לזכור לסגור את אובייקט ה-Scanner באמצעות scanner.close() בסיום השימוש, כדי לשחרר משאבי מערכת.

ייצוג אובייקטים עם toString()

השיטה toString() היא שיטה וירטואלית המוגדרת במחלקת האב Object, והיא נועדה לספק ייצוג מחרוזתי של האובייקט. כברירת מחדל, היא מחזירה מחרוזת המכילה את שם המחלקה ו-hash code של האובייקט.

toString(): שיטה במחלקת Object שנועדה להחזיר ייצוג מחרוזתי קריא של אובייקט.
  • חשיבות: מומלץ מאוד לדרוס (override) את שיטת toString() במחלקות שלכם כדי לספק ייצוג משמעותי וקריא של האובייקט. זה קריטי לניפוי שגיאות (debugging), רישום (logging) והצגת מידע למשתמש.
  • דוגמה: אם יש לכם אובייקט Student, שיטת toString() דרוסה יכולה להחזיר מחרוזת כמו "Student[name=Alice, id=12345]".

הבנת הפניות ואליאסינג (Aliasing)

ב-Java, אובייקטים מטופלים באמצעות הפניות (references). משתנה מסוג אובייקט אינו מכיל את האובייקט עצמו, אלא הפניה למיקום הזיכרון שבו האובייקט מאוחסן.

הפניה (Reference): משתנה המכיל כתובת זיכרון של אובייקט, ולא את האובייקט עצמו.

אליאסינג (Aliasing)

אליאסינג מתרחש כאשר מספר משתני הפניה מצביעים לאותו אובייקט בזיכרון. שינוי באובייקט דרך הפניה אחת ישפיע על כל שאר ההפניות המצביעות לאותו אובייקט.

אליאסינג (Aliasing): מצב שבו מספר משתני הפניה מצביעים לאותו אובייקט בזיכרון.
  • השלכות: אליאסינג יכול להוביל ל"תופעות לוואי" בלתי צפויות, שבהן שינוי שבוצע באמצעות הפניה אחת משפיע על חלקים אחרים בתוכנית המשתמשים באותו אובייקט דרך הפניה אחרת.
  • מניעה: כדי למנוע אליאסינג לא רצוי, ניתן לבצע "העתקה הגנתית" (defensive copying) של אובייקטים במקום להעביר הפניות אליהם ישירות, במיוחד כאשר מדובר באובייקטים הניתנים לשינוי (mutable).

טיפוסים פרימיטיביים

משתנים מאחסנים את הערך עצמו (לדוגמה, int x = 5;). העתקה יוצרת עותק חדש של הערך.

טיפוסי הפניה (אובייקטים)

משתנים מאחסנים הפניה (כתובת) לאובייקט בזיכרון (לדוגמה, Student s1 = new Student();). העתקה מעתיקה את ההפניה, לא את האובייקט.

שאלות לדיון

  • באילו נסיבות תעדיפו להשתמש בשדה סטטי לעומת שדה מופע, ומתי תעדיפו שיטה סטטית לעומת שיטת מופע? תנו דוגמאות.
  • הסבירו את המושג אליאסינג ב-Java. תארו תרחיש שבו אליאסינג יכול להוביל לבעיות בתוכנה, והציעו דרך למנוע זאת.
  • מדוע חשוב לדרוס את שיטת toString() במחלקות שלכם, וכיצד זה תורם לתהליך הפיתוח?
  • כיצד המחלקה Scanner מאפשרת קלט מגוון ממשתמש הקצה, ומהי פעולה חשובה שיש לבצע עם אובייקט Scanner בסיום השימוש?

נקודות לתשובת מודל

  • חברים סטטיים: שדה סטטי מתאים לנתונים משותפים לכל המופעים או קבועים. שיטה סטטית מתאימה לפעולות עזר שאינן דורשות מצב אובייקט ספציפי. חברי מופע מתאימים לנתונים ופעולות הייחודיים לכל אובייקט.
  • אליאסינג: אליאסינג הוא מצב שבו מספר הפניות מצביעות לאותו אובייקט. בעיות יכולות לצוץ כאשר שינוי באובייקט דרך הפניה אחת משפיע על הפניות אחרות באופן בלתי צפוי. מניעה אפשרית באמצעות העתקה הגנתית (deep copy) של אובייקטים במקום העברת הפניות.
  • toString(): דריסת toString() מספקת ייצוג מחרוזתי קריא ומשמעותי של האובייקט, חיונית לניפוי שגיאות, רישום אירועים והצגת מידע למשתמש בצורה ידידותית.
  • Scanner: Scanner מאפשרת קריאת טיפוסים שונים (nextInt(), nextLine(), nextDouble()) מ-System.in. חשוב לסגור את אובייקט ה-Scanner באמצעות close() כדי לשחרר משאבי מערכת ולמנוע דליפות.
מצאתם טעות או שחסר משהו?
→ הקודמת
תכנות מונחה עצמים (OOP) - יסודות
הבאה ←
מערכים