Download presentation
Presentation is loading. Please wait.
1
בניית מחלקות
2
מה זה מחלקה? מאפשר לנו "להרחיב" את שפת התכנות ולהגדיר סוגי נתונים חדשים. ברגע שאנו מגדירים "טיפוס" (מחלקה) חדשה, אנחנו יכולים ליצור מופעים מאותו סוג. לדוגמא : אם הגדרתי מחלקה מסוג מכונית ולייצור שני מופעים של מכוניות מכונית 1 מכונית 2
3
מחלקת מכונית אני מעוניינת לכתוב תוכנית שיש בה מכוניות.
אני חייבת להחליט לשם מה אני שומרת את המכונית ולמה אני צריכה לדעת עליו class Car{ int yearDesign; string name; bool isManufacturedToday; }
4
Car1: yearDesign:1915 Name: Ford T-Model isManufacturedToday : false Car2: yearDesign:1938 Name: Volkswagen beetle isManufacturedToday : true
5
מחלקת נקודה יש הרבה יישומים אשר רוצים לתאר את המיקום על המשטח. לצורך כך נגדיר נקודה Point class Point{ int x; int y; } עכשיו נוכל להגדיר נקודה באופן הבא: Point p = new Point();
6
התנהגויות המחלקה לא די לנו בלהגדיר מה האובייקט שלנו מכיל כלומר איזה נתונים אני חייב לשמור כדי לייצג את המחלקה, אני גם מעוניין לזהות מה המחלקה שלנו יכולה לעשות או מה הם התנהגויות האובייקט שלנו. לדוגמא: אנחנו יכולים לתת ערכים ראשוניים לנקודה אנחנו יכולים להזיז את הנקודה אנחנו יכולים לאחזר את נתוני הנקודה בפורמט מסויים אנחנו יכולים לבדוק האם הנקודה שלנו זהה לנקודה אחרת.
7
תיאור המחלקה באמצעות תרשים מחלקות
אם נרצה לייצג את מה שתיארנו כרגע במילים בצורה גראפית פשוטה וברורה יותר, נוכל להיעזר בתרשים מחלקות שם המחלקה Point + x : int + y : int + init (int, int ) : void + move (int, int) : void + toString ( ) : String + equals (Point) : boolean מאפייני המחלקה attributes שיטות המחלקה methods
8
תרגום התרשים לקוד נוכל להמיר את התרשים שלנו בקלות לקוד class Point{
int x; int y; public void init (int x, int y){ this.x = x; this.y = y;} public void move (int dx, int dy){ this.x+= dx; this.y += dy; } public String toString ( ) { return “(“ + this.x + “,” + this.y + “)”} public boolean equals (Point p) {return this.x == p.x && this.y == p.y;} }
9
שימוש במחלקה שייצרנו public static void main (String [] args) {
Point p = new Point ( ); p.set (12, 3); System.out.println (“We are at the point “ + p.toString( )); p.move (-2, 4); System.out.println (“We are now at the point “ + p.toString( )); Point p1 = new Point (); p1.set (5,3); if (p.equals (p1)) System.out.println (“Both points are at the same place”); else System.out.println (“Both points are at different places”); }
10
תרגול נוסף – מחלקת Time מחלקת Time מייצג טיפוס זמן. אנחנו מעוניינים לנהל זמן המורכב מדקות ושניות. פעולות שנוכל לעשות בזמן: עדכן זמן הצג דקות הצג שעות אחזר זמן בפורמט hh:mm הוסף דקות לזמן חשב הפרש בזמן
11
תרשים מחלקות תרשים מחלקות Time Time + hour : int + minutes: int
+ set (int, int): void + getHours( ) : int + getMinutes ( ): int + toString( ) : String + addMinutes (int ) : void + difference (Time) : int
12
בעיות בארץ המחלקות!!! אם ניקח את המחלקה שזה עתה יצרנו, נראה שיש לנו בעיה קטנה. האם הפעולה הזאת נראית חוקית? Time t = new Time( ); t.hour = 26; t.minutes = 70; קביעה האם זו חוקית נתונה פה לפרשנות. חוקית מבחינה המחשב, כן... ודאי. חוקית מ
13
מנגנון הרשאות הגישה אחד מהיכולות של שפות מונחה עצמים הוא לקבוע מה רמת הרשאת הגישה לחלקים (data members) של המחלקה. :public גישה מותרת לכולם – גם ממחלקות אחרות private: גישה מותרת רק לחברי המחלקה כלומר רק לקוד שנכתב בתוך המחלקה אם נגדיר את המאפיינים שלנו כ-private, אנחנו נמנע את הגישה הישירה ושינוי הנתונים ללא בקרה!
14
שימוש במנגנון הרשאות הגישה
כעת נגדיר את מחלקת ה-Time שלנו באופן הבא: class Time{ private int hours; private int minutes; public void set (int hours, int minutes){…} } אם נגדיר כעת במחלקה אחרת Time t = new Time(); t.hours = 20; // פעולה לא חוקית!
15
גישה באמצעות השיטות את השיטה נגדיר כ-public ובאמצעותו נפקח על השינויים בערכי המאפיינים. class Time{ private int hours; private int minutes; public void set (int hours, int minutes){ this.hours = hours >-1 && hours < 24? hours:0; this.minutes = minutes >-1 && minutes < 60? minutes:0; }
16
שימוש בשיטות setters ו-getters
התכונה הראשונה של תכנות עצמים נקראת כימוס. הרחבת תכונה זו ויצירת תכונת הקופסא השחורה, באה להבטיח שהאובייקט שלנו יכיל רק נתונים אמינים. אם נשאיר את הכל private לא תהיה לנו גישה למחלקה, לא לשינוי (set) ולא לצפיה (get). כדי להבטיח שנוכל לצפות בנתוני המחלקה נגדיר שיטות set ו- get שיבטיחו גישה אמינה לנתוני המחלקה
17
פעולות get אם ניקח את מחלקת Time, נוכל להוסיף לה פעולות:
public int getHours() {return this.hours;} public int getMinutes () { return this.minutes;} במידה ונרצה לדעת כמה דקות יש בזמן שהגדרנו נוכל לעשות את הפעולות הבאות: Time t = new Time(); t.set (12,30); System.out.println (“There are “ + t.getHours() “hours”);
18
פעולות set במקרה שלנו, הגדרנו פעולת set המאתחל את שני חלקי הזמן אבל נוכל גם אחרת public void setHours(int hours){ this.hours = hours > -1 && hours< 24?hours : 0; } public void setMinutes (int min){ this.minutes = min > -1 && min < 60? min:0; public void set (int hours, int minutes){ this.setHours (hours); this.setMinutes (minutes);
19
סיכום מושגים: אובייקט מחלקה מאפיינים שיטות כימוס קופסא שחורה
שיטות setters ו-getters
20
הפניות-References בגאווה יש שני סוגי נתונים:
פרימיטיבים : שהם סוגי הנתונים שמובנים בתוך השפה כמו: int, long, boolean, float, char וכו' מחלקות: אלו הטיפוסים החדשים ש"מתווספים" לשפה הבסיסי כמו: String, Point, Random וכו' Java מתיחס באופן שונה לשני סוגי הנתונים. בעוד שהמשתנים מסוג טיפוסים פרימיטיבים יושבים בזיכרון באיזור התוכנית, המשתנים (האובייקטים) מסוג מחלקות יושבות באזור זיכרון הנקרא הערימה (heap) והמשתנה מכיל הפניה לזיכרון היכן שמורים הנתונים
21
ארגון הזיכרון
22
מה ההבדל בין הביטויים הבאים:
מה ההבדל בקוד? Point p1 = new Point ( ); p1.set (5,5); Point p2 = new Point (); p2.set (5,5); Point p3 = p1; א. כמה אובייקטים הגדרתי? ב. איזה מבין הביטויים הבאים יחזירו אמת p1== p2 p1 == p3
23
הצצה לזיכרון
24
הגדרת שיטה equals כשאנחנו משתמשים באופרטור == אנחנו בודקים האם הערך השמור באופרנד הראשון מכיל אותו ערך כמו הערך השמור באופרנד השני. כאשר אנחנו עובדים עם מחלקות, הפעולה אינה בודקת את תוכן האובייקט אלא הערך השמור דהיינו ההפניה! גם אם שני האובייקטים מכלים בדוייק את אותו הערך, עדיין הביטוי == יחזיר שקר. מטרת הפעולה equals בא לבדוק האם הערכים השמורים במחלקה הם אותם ערכים.
25
הוספת פעולת 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))…
26
סיכום הפניות מושגים : טיפוס פרימיטיבי טיפוס מסוג מחלקה (אובייקט)
הפניה (כתובת) איזור זיכרון הערימה(Heap) שמירת אובייקטים נעשית באזור הזיכרון של הערימה ובמשתנה נשמר ההפניה לאזור הערימה. פעולת == בודקת האם מדובר באותה אובייקט השמור בשני משתנים שונים פעולה equals בודקת את תוכן האובייקט לראות האם הם מכילים את אותם הערכים
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.