150 likes | 308 Views
הפניות ושיטות בונות. הפניות- References. בגאווה יש שני סוגי נתונים: פרימיטיבים : שהם סוגי הנתונים שמובנים בתוך השפה כמו: int, long, boolean, float, char וכו' מחלקות: אלו הטיפוסים החדשים ש"מתווספים" לשפה הבסיסי כמו: string, Point, Random וכו' JAVA מתיחס באופן שונה לשני סוגי הנתונים.
E N D
הפניות-References בגאווה יש שני סוגי נתונים: • פרימיטיבים : שהם סוגי הנתונים שמובנים בתוך השפה כמו: int, long, boolean, float, char וכו' • מחלקות: אלו הטיפוסים החדשים ש"מתווספים" לשפה הבסיסי כמו: string, Point, Random וכו' JAVAמתיחס באופן שונה לשני סוגי הנתונים. בעוד שהמשתנים מסוג טיפוסים פרימיטיבים יושבים בזיכרון באיזור התוכנית, המשתנים (האובייקטים) מסוג מחלקות יושבות באזור זיכרון הנקרא הערימה (heap) והמשתנה מכיל הפניה לזיכרון היכן שמורים הנתונים
מה ההבדל בין הביטויים הבאים: מה ההבדל בקוד? Point p1 = new Point ( ); p1.set (5,5); Point p2 = new Point (); p2.set (5,5); Point p3 = p1; א. כמה אובייקטים הגדרתי? ב. איזה מבין הביטויים הבאים יחזירו אמת p1== p2 p1 == p3
הגדרת שיטה equals כשאנחנו משתמשים באופרטור == אנחנו בודקים האם הערך השמור באופרנד הראשון מכיל אותו ערך כמו הערך השמור באופרנד השני. כאשר אנחנו עובדים עם מחלקות, הפעולה אינה בודקת את תוכן האובייקט אלא הערך השמור דהיינו ההפניה! גם אם שני האובייקטים מכלים בדוייק את אותו הערך, עדיין הביטוי == יחזיר שקר. מטרת הפעולה equals בא לבדוק האם הערכים השמורים במחלקה הם אותם ערכים.
הוספת פעולת equals אם נחזור למחלקה Time נוסיף פעולה Equals אשר בודקת האם שני הזמנים שלפנינו זהים. public boolean equals (Time t){ return this.hours== t.hours && this.minutes == t.minutes; } כדי להשוות האם הערך זהה נכתוב כך: Time t1 = new Time (); t1.set (12,30); Time t2 = new Time( ); t2.set (12,30); if (t1.equals (t2))…
סיכום הפניות מושגים : • טיפוס פרימיטיבי • טיפוס מסוג מחלקה (אובייקט) • הפניה (כתובת) • איזור זיכרון הערימה(Heap) שמירת אובייקטים נעשית באזור הזיכרון של הערימה ובמשתנה נשמר ההפניה לאזור הערימה. פעולת == בודקת האם מדובר באותה אובייקט השמור בשני משתנים שונים פעולה equals בודקת את תוכן האובייקט לראות האם הם מכילים את אותם הערכים
איתחול אובייקט במידה ורצינו לתת ערך ראשוני לאובייקט מסויים היינו חייבים לעשות את זה בשני שלבים: • איתחול באמצעות new • ביצוע set ומתן ערכים ראשוניים השימוש בשיטה בונה מאפשרת לנו לעשות שני השלבים האילו ב"מכה אחת". השימוש בשיטה בונה מאפשרת לנו לעשות את שני השלבים בבת אחת.
שיטה בונה - Constructor הגדרה של שיטה בונה זה: שיטה אשר מיישמת את הפעולות הדרושות לאיתחול אובייקט. שיטה בונה היא בראש ובראשונה שיטה. לשיטה הזאת שני מאפיינים עיקריים • שם השיטה כשם המחלקה • שיטה שאינה מחזירה ערך. תפקיד השיטה הבונה: לאפשר יישום של לוגיקה ומתן ערכים ראשוניים בעת יצירת האובייקט
דוגמא לשיטה בונה class Point{ private int x; private int y; public void setX (int x){this.x = x;} public int getX (){ return this.x;} public void setY() {this.y = y;} public int getY() {return this.y;} public Point (int x, int y){ setX(x); setY(y); } }
זמן ביצוע שיטה בונה הפעולה מתבצעת בעת הקצאת זיכרון בזמן יצירת האובייקט. זימון שיטה בונה: Point p = new Point (5,7); בעת כתיבת ה-new אנחנו מפעילים אוטומטית את השיטה הבונה ואין לנו אפשרות ל"מנוע" זימון השיטה. האם היה עד כה שיטה בונה? ודאי, רק אנחנו לא כתבנו אותו אלא קיבלנו אותו כחלק מהשפה!
ביטול שיטת ברירת מחדל של המערכת אם אני כעת אכתוב: Point p = new Point(); זה יחשב כשגיאת קומפילציה כי כעת אין לנו את "המתנה" שקיבלנו. כתיבת שיטה בונה מבטלת את השיטה הבונה שקיבלנו!!! במידה ונרצה שיטה בונה ברירת מחדל, יש להשתמש במנגנון העמסת שיטות כדי שנוכל לזמן שיטה בונה ברירת מחדל
שיטה בונה ברירת מחדל שיטה בונה ברירת מחדל: שיטה בונה ללא פרמטרים. שיטה בונה מעתיק: שיטה בונה המקבלת כפרמטר אובייקט מסוג המחלקה שנבנה
דוגמא לשיטות בונות class Time{ private int hour; private int minute; public void setHour(int hour){ this.hour = hour >-1 && hour < 24?hour:0;} public int getHour () {return this.hour;} public void setMinute (int minutes) {this.minute = minutes >-1 && minutes < 60?minutes:0 public int getMinutes ( ) {return this.minute;} } public Time (int hour, int minute){ this.setHour(hour); this.setMinute(minute); } public Time (int hour){ this (hour,0);} public Time (Time t){this (t.Hour,t.Minute);} }