המחלקה Object
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 24 מתוך 87.
ב-Java, כל מחלקה שאתה יוצר יורשת באופן אוטומטי ממחלקה מיוחדת שנקראת Object. גם אם אינך כותב extends בשום מקום, המחלקה שלך עדיין צאצאית של Object. כך Object הופכת לשורש של כל היררכיית המחלקות.
public class Person {
// זה יורש מ-Object באופן מרומז
}
// שקול ל:
public class Person extends Object {
}מכיוון שכל מחלקה יורשת מ־Object, לכל אובייקט ב־Java יש גישה לכמה מתודות מובנות. המתודות הנפוצות ביותר כוללות:
| מתודה | מטרה |
|---|---|
toString() | מחזירה ייצוג מחרוזתי של האובייקט |
equals(Object obj) | משווה בין שני אובייקטים כדי לבדוק אם הם שווים |
hashCode() | מחזירה ערך קוד גיבוב עבור האובייקט |
getClass() | מחזירה את מחלקת זמן הריצה של האובייקט |
כברירת מחדל, למתודות האלה יש מימושים כלליים. לדוגמה, toString() מחזירה את שם המחלקה ואחריו @ ואת קוד הגיבוב של האובייקט בהקסדצימלי, דבר שאינו שימושי במיוחד:
Person p = new Person();
System.out.println(p.toString()); // פלט: Person@1a2b3c4dזו הסיבה שלעיתים קרובות תדרסי את המתודות האלה במחלקות שלך כדי לספק התנהגות בעלת משמעות. ההבנה ש־Object היא מחלקת האב האוניברסלית עוזרת להסביר מדוע אפשר לאחסן כל אובייקט במשתנה מסוג Object ומדוע מתודות מסוימות זמינות בכל אובייקט שיוצרים.
אתגר
קלנבדוק כיצד המחלקה Object משמשת כמחלקת־האב האוניברסלית של כל מחלקות Java, על ידי בניית מערכת פשוטה לניהול מלאי של גאדג'טים שמדגימה שיטות שעוברות בירושה מ־Object.
תיצרו שלושה קבצים כדי לארגן את הקוד:
Gadget.java: צרו מחלקה שמייצגת גאדג'ט אלקטרוני. המחלקה צריכה לכלול:- שדות פרטיים עבור
name(String) ו־year(int) - בנאי שמאתחל את שני השדות
- שיטות getter בשם
getName()ו־getYear()
- שדות פרטיים עבור
Smartphone.java: צרו מחלקת־משנה שיורשת מ־Gadget ומוסיפה מאפיינים ייחודיים לסמארטפון:- שדה פרטי עבור
brand(String) - בנאי שמקבל name, year ו־brand — השתמשו ב־
super(name, year)עבור החלק של מחלקת־האב - שיטה
getBrand()שמחזירה את המותג - דרסו את השיטה
toString()כדי להחזיר:Smartphone: [brand] [name] ([year])
- שדה פרטי עבור
Main.java: הדגימו את ההבדל בין שיטות ברירת המחדל שלObjectלבין שיטות שנדרסו. תקבלו שלוש קלטים: שם של גאדג'ט, שנה ומותג. צרו גם אובייקטGadgetוגם אובייקטSmartphoneבאמצעות אותו שם ואותה שנה (ובתוספת המותג עבור הסמארטפון), ואז:- הדפיסו את שם המחלקה של הגאדג'ט באמצעות
getClass().getSimpleName() - הדפיסו האם
toString()של ברירת המחדל של הגאדג'ט מכילה את הסימן "@" (הדפיסוtrueאוfalse) - הדפיסו את הסמארטפון באמצעות
toString()שנדרסה
- הדפיסו את שם המחלקה של הגאדג'ט באמצעות
תקבלו שלושה קלטים: שם הגאדג'ט/סמארטפון (String), שנה (int) ומותג (String).
האתגר הזה מדגים למה חשוב לדרוס שיטות של Object — שיטת ברירת המחדל toString() מחזירה משהו כמו Gadget@1a2b3c, ואילו הגרסה המותאמת אישית מספקת מידע משמעותי!
נסו בעצמכם
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// קרא את הקלטים
String name = scanner.nextLine();
int year = scanner.nextInt();
scanner.nextLine(); // צרוך את תו השורה החדשה
String brand = scanner.nextLine();
// TODO: צור אובייקט Gadget עם name ו-year
// TODO: צור אובייקט Smartphone עם name, year ו-brand
// TODO: הדפס את שם המחלקה של הגאדג'ט באמצעות getClass().getSimpleName()
// TODO: הדפס האם toString() של הגאדג'ט מכיל "@" (true או false)
// TODO: הדפס את הסמארטפון (משתמש ב-toString() שנדרס)
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין