3 אובייקטים ומחלקות חלק בנאים
Transcription
3 אובייקטים ומחלקות חלק בנאים
אובייקטים ומחלקות חלק 3 בנאים • בנאי של מחלקה. • הבנאי הריק. • ריבוי בנאים. בנאי • ראינו שבכדי ליצור אובייקט ממחלקה כלשהי השתמשנו בפקודה newבצורה הבאה: ;)(Person p = new Person • הפקודה newמשתמשת בשיטה מיוחדת כדי ליצור את האובייקט .שיטה זו נקראת בנאי – Constructor • תפקידו של הבנאי הוא ליצור את שטח הזיכרון שדרוש לאובייקט בערימה. הבנאי הריק • בכל מחלקה בג'אווה קיים בנאי ריק ( empty )constructorדיפולטיבי ,שתפקידו לבנות את זיכרון האובייקט. • נוכל לכתוב בעצמנו את הבנאי הריק. • לבנאי יש שתי תכונות חשובות – – הוא השיטה הראשונה שמתבצעת במהלך חיי האובייקט. – הוא מתבצע פעם אחת בלבד במהלך חיי האובייקט. • לכן הבנאי הוא מקום טוב לבצע אתחולים של תכונות. public class Person – אבל,בנאי הוא שיטה { שם הבנאי זהה לחלוטין לשם.1 public String name; .המחלקה בה הוא נמצא public int age; public Person() הבנאי לא מחזיר ערך בכלל.2 .)void (גם לא { name = “”; public static void main(String[] args) age = 0; { } Person p = new Person(); } } public class Person { public String name; ריבוי בנאים – למחלקה public int age; ,יש עכשיו שלושה בנאים public Person() { שנבדלים אחד מהשני name = “”; .בחתימה שלהם age = 0; } public Person(String n, int a) { name = n; age = a; } public Person(String n) { name = n; age = 0; } } public class Person { public static void main)…( public String name; { public int age; Person p1 = new Person(); public Person() { Person p2 = new Person)“Dov”, 23); name = “”; Person p3 = new Person)“David”(; age = 0; } } public Person(String n, int a) { name = n; age = a; } public Person(String n) { name = n; age = 0; } } public class Person { public String name; ריבוי בנאים נועד לתת public int age; למשתמש אופציות public Person() { במקרה.ליצירת אובייקט name = “”; המשתמש יכול,הזה age = 0; לבחור ליצור אובייקט } public Person(String n, int a) { באחתPerson מסוג name = n; .משלוש דרכים שונות age = a; } public Person(String n) { name = n; age = 0; } } public class Person { public String name; public int age; public static void main)…( { Person p1 = new Person(); Person p2 = new Person)“Dov”, 23); Person p3 = new Person)“David”(; } public Person(String n, int a) { name = n; age = a; אבל אמרנו שלכל מחלקה יש } בנאי ריק דיפולטיבי – למה public Person(String n) { main-השורה הראשונה ב name = n; לא מפעילה את הבנאי age = 0; } ?הדיפולטיבי } לכל מחלקה בג'אווה יש בנאי ריק דיפולטיבי בתנאי שאין במחלקה אף בנאי אחר! מספיק שיש במחלקה לפחות בנאי אחד שהוא לא ריק ,וברירת המחדל כבר לא קיימת למה???? כיוון שג'אווה מניחה שאם כבר כתבנו במחלקה בנאי אחד לפחות שהוא לא ריק ,אנחנו כנראה לא רוצים בנאי ריק ,ולא מעוניינים לתת למשתמש אופציה ליצור אובייקט באמצעות הבנאי הריק .לכן ג'אווה לא עוקפת את ההחלטה שלנו ,אלא מבטלת את הבנאי הריק ,כאשר קיים בנאי אחר שהוא לא ריק. מצד שני ,אם לא כתבנו אף בנאי ,אין לג'אווה ברירה והיא מוסיפה בנאי ריק דיפולטיבי. public class Person { public static void main)…( public String name; { public int age; Person p1 = new Person(23,”Dov”(; public Person() { } name = “”; age = 0; אין בנאי שחתימתו } ,String ואזint מקבלת public Person(String n, int a) { name = n; ולכן הפקודה לא חוקית כי age = a; לא יכולהnew-פקודת ה } .לבנות את האובייקט public Person(String n) { name = n; age = 0; } } תרגיל • • • • כתבו מחלקה בשם Productהמייצגת מוצר בחנות. למחלקה יהיו תכונות של שם המוצר ,מחיר המוצר וכמות המוצר במלאי. הוסיפו למחלקה בנאי שמקבל שם ,מחיר וכמות, ומאתחל את התכונות .אם המחיר או הכמות הם שליליים ,הבנאי יציב ערך 1בתכונות. הוסיפו בנאי שמקבל רק שם ,מאתחל את התכונה, ומציב אפס במחיר ובכמות.