תרגול מדעי המחשב

בנאי העתקה והשוואת עצמים

בינוני Java

המשימה

נתונה המחלקה Book עם שתי תכונות פרטיות: כותרת ושנה.

השלם אותה כך שתכלול:
• בנאי רגיל שמקבל כותרת ושנה.
• **בנאי העתקה** — בנאי שמקבל ספר קיים ובונה ממנו ספר חדש עם אותם
  ערכים.
• פעולת setYear שמשנה את השנה.
• פעולה sameAs שמקבלת ספר אחר ומחזירה true אם שני הספרים בעלי אותה
  כותרת ואותה שנה.

הנחיות:
• השוואת מחרוזות נעשית ב-equals ולא ב-== . השוואה ב-== משווה הפניות,
  ולכן היא עלולה להחזיר false על שתי מחרוזות זהות.
• זו בדיוק הנקודה של התרגיל: `Book b = a;` אינו העתקה — שני השמות
  מצביעים על אותו עצם, ושינוי דרך אחד נראה גם דרך השני. בנאי העתקה
  יוצר עצם **חדש**, ולכן שינוי בו אינו משפיע על המקור.
• sameAs משווה ערכים, לא הפניות. שני עצמים נפרדים עם אותם ערכים —
  התשובה true.

```ds:table
{"title":"הבדיקה שבקוד","rows":[["שלב","a","עותק","sameAs"],["אחרי ההעתקה","Dune 1965","Dune 1965","true"],["אחרי setYear(2000) על העותק","Dune 1965","Dune 2000","false"]]}
```

קוד הפתיחה

class Book {
    private String title;
    private int year;

    public Book(String title, int year) {
        // אתחל את התכונות
    }

    /** בנאי העתקה — בונה ספר חדש עם אותם ערכים כמו other. */
    public Book(Book other) {
        // כתוב את הפתרון כאן
    }

    public String getTitle() {
        return "";
    }

    public int getYear() {
        return 0;
    }

    public void setYear(int year) {
        // עדכן את השנה
    }

    /** האם שני הספרים בעלי אותה כותרת ואותה שנה. */
    public boolean sameAs(Book other) {
        // כתוב את הפתרון כאן
        return false;
    }
}

public class Main {
    public static void main(String[] args) {
        Book a    = new Book("Dune", 1965);
        Book copy = new Book(a);

        System.out.println(a.sameAs(copy));   // true

        copy.setYear(2000);
        System.out.println(a.getYear());      // 1965  — המקור לא נפגע
        System.out.println(copy.getYear());   // 2000
        System.out.println(a.sameAs(copy));   // false

        Book ref = a;                         // לא העתקה — אותו עצם
        ref.setYear(1999);
        System.out.println(a.getYear());      // 1999

        Book x = new Book("Dune", 1999);
        System.out.println(a.sameAs(x));      // true — ערכים זהים
    }
}

כדי לכתוב, להריץ ולקבל משוב — התחבר עם חשבון Google. לוקח שנייה.

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