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‬בתכונות‪.‬‬
‫הוסיפו בנאי שמקבל רק שם‪ ,‬מאתחל את התכונה‪,‬‬
‫ומציב אפס במחיר ובכמות‪.‬‬