Menu
Coddy logo textTech

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

challenge icon

אתגר

קל

נבדוק כיצד המחלקה Object משמשת כמחלקת־האב האוניברסלית של כל מחלקות Java, על ידי בניית מערכת פשוטה לניהול מלאי של גאדג'טים שמדגימה שיטות שעוברות בירושה מ־Object.

תיצרו שלושה קבצים כדי לארגן את הקוד:

  • Gadget.java: צרו מחלקה שמייצגת גאדג'ט אלקטרוני. המחלקה צריכה לכלול:
    • שדות פרטיים עבור name (String) ו־year (int)
    • בנאי שמאתחל את שני השדות
    • שיטות getter בשם getName() ו־getYear()
    אל תדרסו אף שיטה מ־Object — קודם נרצה לראות את התנהגות ברירת המחדל.
  • 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() שנדרס)
        
    }
}
quiz iconבחנו את עצמכם

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

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

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