עצמי ם תכנות מ תקד ם בשפת Java אוהד ברזילי אוניברסיטת ת ל אביב
עצמי ם המצגת מכילה קטעים מתוך מצגת של פרופ' עמירם יהודאי ע"פ הספר: Object-Oriented Software Construction, 2nd edition, by Bertrand Meyer (Prentice Hall). כל ה זכויו ת ש מו רו ת ל מ חברים
עצמי ם ע צם הוא מופע ז מן-ריצה (instance) של מחלקה עצם הוא מופע ישיר של בדיוק מחלקה אחת, המחלקה היוצרת, ואולי מופע של מחלקות נוספות כתוצאה מירושה מבנה הנתונים המייצג עצם מכיל שדות נתונים בלבד ללא פונקציות (מתודות) 3 אוניברסיטת תל אב י ב
POINT Class public class POINT { private float x, y; // Routines... } 4 אוניברסיטת תל אב י ב
Simple Book public class BOOK1 { private String title; private int date, page_count; } התרשים פשטני מחרוזת היא עצם ולכן השדה title מכיל רק הפנייה אליו 5 אוניברסיטת תל אב י ב
Simple Book public class BOOK1 { private String title; private int date, page_count; } 6 אוניברסיטת תל אב י ב
Writer Class public class WRITER { private String name, real_name; private int birth_ year, death_ year; } 7 אוניברסיטת תל אב י ב
עצמי ם נסווג את ה שדות ל סוגים לפי טיפוסיהם: טיפוסים יסודיים (פרימיטיבים): חלק משפת התכנות. כגון: int, char, float, bool (אבל לא (string טיפוסים מו רכ בים (user defined types) שדה מורכב: עצ ם מוכל או עצם מוצבע? 8 אוניברסיטת תל אב י ב
תת עצמי ם 9 אוניברסיטת תל אב י ב
עצמי ם, מצבי עים ו התייח סוי ות Point p1 = new Point(); Point p2; p2 = p1; p1.setx(4); x y 0 0 10 אוניברסיטת תל אב י ב
עצמי ם, מצבי עים ו התייח סוי ות Point p1 = new Point(); Point p2; p2 = p1; p1.setx(4); x y p1 0 0 11 אוניברסיטת תל אב י ב
עצמי ם, מצבי עים ו התייח סוי ות Point p1 = new Point(); Point p2; p2 = p1; p1.setx(4); p2 #@$$ x y p1 0 0 12 אוניברסיטת תל אב י ב
עצמי ם, מצבי עים ו התייח סוי ות Point p1 = new Point(); Point p2; p2 = p1; p1.setx(4); p2 #@$$ x y p1 0 0 13 אוניברסיטת תל אב י ב
עצמי ם, מצבי עים ו התייח סוי ות Point p1 = new Point(); Point p2; p2 = p1; p1.setx(4); p2 x y p1 0 0 14 אוניברסיטת תל אב י ב
עצמי ם, מצבי עים ו התייח סוי ות Point p1 = new Point(); Point p2; p2 = p1; p1.setx(4); p2 x y p1 4 0 15 אוניברסיטת תל אב י ב
עצמי ם, מצבי עים ו התייח סוי ות נשים לב כי כל העצמים בשפת (חסרי שם) להב ד לי משפות אחרות (כגון ++C) הפנייה ב Java הם אנונימ יי ם Java היא ישות עצמאית, משתנה בפני עצמו, שעשויה להכיל כתובת של אובייקט קיים. ניתן לעדכן את ערכה של ההפנייה ובכך להחליף את העצם המוצבע. לא נתבלבל עם העברת נתונים לפונקציה by.reference העתקה או אי העתקת העצם לא תלויה בעצם עצמו אלא בהגדרת שיטת ההעברה בפונקציה 16 אוניברסיטת תל אב י ב
עצם מו כל או מו צבע? תת עצמים תופסים יותר זכרון עצמים מוצבעים קל יותר לשתף בין מספר ישויות לא כל המצביעים מאותחלים אוטומטית (ל- (null כך שקיימות 3 אפשרויות: בשפת המצביע מתייחס לעצם אחד מסוים מצביע לכתובת 'זבל' המצביע הוא null כלומר לא משויך לעצם מסוים Java השאלה לא קיימת מכיוון שאין עצמים מוכלים 17 אוניברסיטת תל אב י ב
מו צבע 18 אוניברסיטת תל אב י ב
לא מ שויך לאף עצם 19 אוניברסיטת תל אב י ב
זהו ת של עצמים שני עצמים נפרדים עשויים להיות זהים שוויון שדות אינו תנאי מספיק לזהותם של שני עצמים 20 אוניברסיטת תל אב י ב class WRITER { String name; int birth_year, death_year; } class BOOK { String title; int date; WRITER *author; }
מעגלים בי חס הלקוחו ת מחלקה עשויה להיות לקוחה של ע צמה נבדיל בין מעגל של ע צמים ומעגל של מחלקות 21 אוניברסיטת תל אב י ב class PERSON1{ } string name; PERSON1 loved_one, landlord;
מצבי ע לעצמו 22 אוניברסיטת תל אב י ב
יתרונות העצם המו כל יעילות גישה לשדות מוכלים שלא דרך מודל טוב יותר מצביע למחלק ה S פירושו שהלקוח 23 אוניברסיטת תל אב י ב dereference של מצביע "יודע על" S עצם כ עצם מוכל מעיד על כ ך שהלקוח מכיל S בפ רט, הכל ה מרמזת על אי-שיתוף תמי כה אחידה ב טיפוסים פרימיטיבים עצמים מכילים את הטיפוסים היסודיים עצמם ולא מצביע אליהם
אוביי קט ים מו רכבי ם 24 אוניברסיטת תל אב י ב
עצמי ם מו כלים לא יתכנו מעגלי ספק-לקוח כאשר הספק הוא עצם מוכל type) (expanded יצירה והריסה של האובייקט המוכל תלויה בזמני היצירה וההריסה של העצם המכיל בהשמת העצם העוטף לא יופעל בהכרח אופרטור ההשמה של כל אחד משדותיו המוכלים כאשר עצם מכיל מצביעים לעצמים אחרים יש לשקול מתי לשחרר את הזכרון של עצמים אלו (למשל אם הם משותפים לכמה עצמים) 25 אוניברסיטת תל אב י ב
הכלה או הצבעה? בשפת ע צמים Java הוחלט שלא לאפשר הכלת כל ההתייחסויות ל ע צמים הן הפניות 26 אוניברסיטת תל אב י ב
פונקציה יוצרת יצירת ואתחול ע צמים מפורשת כאשר בפונקציה כלשהי מגיעים לשורה T() T x = new קורים הדברים הבאים: מוקצ ה מ קום עבור עצם מטיפוס T (ע בור כל אחד מ ש ד ותיו) x מק בל את כתובתו ש ל הע צם ש הו קצה.1.2 27 אוניברסיטת תל אב י ב
מצבי עים ו מצבם מצביע יכול להיות קשור או לא קשור לעצם מצביע p יקשר לעצם ע"י: p=new SomeClass(...) או ע"י, p=p1 כאשר p1 הוא מצביע קשור p יהפך ללא קש ור ע"י: null הוא p1 p=null או ע"י p=p1 כאשר הפע לת מ תודה דרך מצ ביע שאינ ו קשור תגרום לטע ות ז מן ריצה 28 אוניברסיטת תל אב י ב
פעולות על מ צביעים ה ש מ ה ש ל מצ ביעים אינה מ בצעת העתק ה ש ל האובייקט ה מוצ בע ההשוואה בין מצביעים p1==p2 תחזיר true רק אם הם מצביעים על אותו עצם עצמו או ששניהם null הה ש מ ה p=null ש ימו ש ית כדי: לבדוק בהמשך האם ערך 'זיבלי') 29 אוניברסיטת תל אב י ב p!=null (שכן למצביע עלול להיות גם לעזור ל Garbage Collector להבין שהעצם המוצבע אינו נחוץ עוד
קשירת מצבי ע class PERSON2 { String name; PERSON2 loved_one, landlord; } /**Attach the loved_one field of current object to l. */ void set_loved (PERSON2 l){ loved_one = l; } 30 אוניברסיטת תל אב י ב
קשירת מצבי ע Before a.set_loved (r) After תכנות מתקדם בשפת Java 31 אוניברסיטת תל אביב
איפוס מצבי ע (ללא שחרור!) x = null 32 אוניברסיטת תל אב י ב
פונקציה יוצרת במחלקות שנכתוב ניתן (ורצוי?) להחליף את אתחול ברירת המחדל בפונקציה פונקציה זו נקראת הבנאי המחלקה ניתן להעמיס אותה ניתן להעבי ר לה פרמטרים (constructor) של שמה כשם המחלקה שאותה היא מאת חלת ואין לה ערך מוחזר 33 אוניברסיטת תל אב י ב
בנ אים ל Point public class Point { //... public Point() { m_x = 0; m_y = 0; } } public Point(int x, int y) { m_x = x; m_y = y; } //... 34 אוניברסיטת תל אב י ב
ריבוי בנ אים כדי לשמור על עיקביות בתחזוקת מספר גרסאות מועמסות של אותה הפונקציה מומלץ להשתמש בקריאות הדדיות בין הגרסאות המועמסות בהע מסת ב נאים, הקריאה this(args) קוראת לבנאי מועמס שחתימתו תואמת את args 35 אוניברסיטת תל אב י ב
בנ אי יותר טו ב ל Point public class Point { //... public Point(int x, int y) { m_x = x; m_y = y; } public Point() { this(0,0); } //... } 36 אוניברסיטת תל אב י ב
עוד על בנ אים פונקצית אתחול שהוגדרה כ private לא תאפשר ליצור באמצעותה עצמים למחלקה שלא נכתבו עבורה בנאים כלל מספק המהדר (הקומפיילר) בנאי ברירת מחדל ) default (constructor זהו בנאי חסר פרמטרים שאינו עושה דבר מרגע שנכתב בנאי כלשהו למחלקה לא ניתן עוד להשתמש בבנאי ברירת המחדל יש מקרים שבהם נהיה חייבים להשתמש בבנאי חסר פרמטרים ולכן נגדיר כזה לכל מחלקה 37 אוניברסיטת תל אב י ב
יצירה וא תחול מפורשים עצ מי ם נוצרים רק ע"י שי מו ש מפור ש באופרטור new int [] arr = {1, 2, 3}; 2 יוצ אי דופן: אתחול מערך: יצירת מחרוזות ע"י מרכאות: String hello = "hello"; 38 אוניברסיטת תל אב י ב