9

ג'אווה - תכנות מונחה עצמים - מחלקות ואובייקטים

  • Upload
    -

  • View
    1.205

  • Download
    1

Embed Size (px)

DESCRIPTION

חלק מסדרת הרצאות בנושא "תכנות מונחה עצמים בסביבת ג'אווה", והפעם: מחלקות ואובייקטים / כיתות ומופעים.

Citation preview

Page 2: ג'אווה - תכנות מונחה עצמים - מחלקות ואובייקטים

Instances - מופעים – אובייקטים

גדולות יותר של מרכיבות בעצמן קבוצות שהעולם הסובב אותנו מלא בעצמים. עצמים אלו משתייכים לרוב לתתי קבוצות

קשרים, ישירים או עקיפים, וניתן לבצע חלוקה של אותן קבוצות עצמים וכן הלאה. בין הקבוצות יש הרבה פעמים יחסים או

עפ"י אופיין, או תכונות מסוימות שהן מקיימות או חולקות.

יישום, נו לדבר על מושגים כגון עצמים, ניתן להבין את הקשר העמוק שקיים לעולם החיצון, עולם החיים, המאפשר למכאן,

נלקחו בהשאלה לתוך אותו תחום ,ים שמקורם טמון בעצם קיומם בעולם האמתיועוד קונספטים רב , רב צורתיותהורשה

תחום לוהפכו לחלק בלתי נפרד ממנו, דבר שהכניס רוח חיים ויכולות מרשימות במדעי המחשב הקרוי תכנות מונחה עצמים

התכנות בכלל.

תכונות ופעולות המאפיינות אותו ובייקט()א תכנות מונחה העצמים, ניתן לשייך לכל עצםהכמו בעולם האמתי, כך גם בעולם

.)ניקח לדוגמה חייל בצבא, חלק מהתכונות שלו הן "שם", "שם משפחה", "מס' אישי", "גובה"...(

ע"י הערך המוכל בתוכם והפעולות הן המתודות שניתן לאמודמשתנים ןהתכונות ההחייל יכול להיות האובייקט, בתכנות,

.)במקרה של חייל זה יכול להיות "החזר מס' אישי", "קלע למטרה"...( האובייקטהניתנות לביצוע על

אבסטרקטי , או בריאותי ובדיקת מצבעם תכונות כמו צבע וחוזק ופעולות כמו לנשור פיזי כגון "שערה" אובייקט יכול להיות

.או להחזיר סטטוס התקדמות להסתיים, עם תכונות כמו משך ועלות ופעולות כמו להתחיל "תספורת"כגון

)יצירת מופע( ממחלקה מסוימת באופן הבא: instantiationאובייקט יווצר ע"י

ClassName objectName = new ClassName(/*parameters for the class's constructor if needed*/);

Instance Variables –משתני מופע

ניתן לשינוי באופן ייחודי עבור אותו האובייקט מבלי משתנה כזה , ה מופענקרא משתנ כל משתנה אשר שייך לאובייקט

, שינוימחזיקים במשתנים הזהים בשמם ובטיפוסם מס' אובייקטים שישפיע על שאר האובייקטים מאותו הסוג, כך שגם אם

.האובייקט הספציפי בו נערך השינוי המשתנה של אותו ייעשה אך ורק עבורשל משתנה זה

ויצרנו שני אובייקטים מטיפוס "מכונית", כל אחד מהם ייבנה לפי אותה התבנית בדיוק, כך שלשניהם יהיו אותם נניח

המשתנים בדיוק )לדוגמה "חברה מייצרת", "שנת ייצור"( ובכל אחד מהאובייקטים ניתן להזין ערך שונה עבור כל אחד

מהמשתנים מבלי קשר של תלות ביניהם.

נשים שמם של אאדם בשם ירון מחליט לשנות את שמו לצביקה, אין זה משפיע על יות למשל כאשר דוגמה נוספת יכולה לה

ולא את שמם של כל האנשים. שמוירון שינה את השם ירון, אלא על אותו האדם בלבד.אחרים כולל על אנשים אחרים עם

:דוגמה להגדרת משתנה מופע

class ClassName { //Class Variables Section //Instance Variables Section private String id; //Class Methods Section //Instance Methods Section }

Page 3: ג'אווה - תכנות מונחה עצמים - מחלקות ואובייקטים

finalization –סיום החיים של אובייקט

בתהליך JVM-מבלי שהיא מבצעת פעולה מיוחדת מלבד העובדה שהיא מורצת ע"י ה Object-מגיעה מ ()finalizeהמתודה

למתודה ע"מ overridingסיום חייו של האובייקט. היא מיועדת לשם "סגירת פינות", שחרור משאבים וכד'. ניתן לבצע

להגדיר את פעולתה מחדש, וע"מ שיהיה ניתן לעשות זאת, הגדרתה צריכה להיראות בדיוק כך:

protected void finalize() { /*New logic goes here*/ }

שהוגדרה finalizeאם המתודה נדרסה ע"י מחלקה שמורישה למחלקה אחרת, יש לבצע קריאה לאותה מתודה מתוך

במחלקה היורשת באופן הבא:

super.finalize();

"ולכן אין "לבנותבזמן ()finalizeיפעיל את GarbageCollector-אין ערובה לכך שהלמרות ההסברים לשימוש במתודה זו,

.ודאיבאופן תפקדשתעליה

Page 4: ג'אווה - תכנות מונחה עצמים - מחלקות ואובייקטים

Classes - מחלקות

מחלקה ניתן לתאר כל תכנית בג'אווה בנויה ממקבץ של מחלקות וכל שורת קוד בתוכנית חייבת להשתייך למחלקה מסוימת.

ממנה נוצרים אובייקטים. "שבלונה"כ

השדותע"מ להמחיש מהי מחלקה, ניקח לדוגמה "טופס עובד", בו קיימים

" )ממולא מראש ע"י המפעל( XXX"מס' עובד:

" "שם:

" "משפחה:

" "ת.ז.:

" "כתובת:

כדי פעם אחת ונניח שיש רק טופס אחד כזה )עותק מאסטר( ועבור כל אדם שמבקש להפוך לעובד משכפלים את הטופס

לעובד. ופךבידי אדם מסוים, אותו אדם ה המשוכפל הטופס מילויחר רק לאשיוכל למלא את פרטיו.

.name, lastName, id, addressאשר מוצהרים בה המשתנים Workerשקול למחלקה בשם הנ"ל טופס העובד

אותו אדם שקול לאובייקט אשר . הוא הופך לעובד במפעל המשוכפל, כאשר מגיע אדם וממלא את הפרטים בטופסכאמור,

שורת קוד כגון השורה הבאה:קט כזה יווצר בפועל ע"י אוביי .Worker נוצר מהמחלקה

Worker manager=new Worker("John","Doe","098256558","22 Habonim St., Kfar Yam, Israel");

אובייקטים( ומה שמאפיין את כל ליצור עוד ועוד עוד ועוד עובדים ) לקבלמרגע שיש בידנו את הטופס )המחלקה(, ניתן

שלכולם יש את אותם המאפיינים מבחינת המפעל: לגבי כולם שומר המפעל את שמם, שם משפחתם, הללו, הוא העובדים

לכל העובדים נתונים שונים, כגון שמות שונים )ערכי , כמובן שן המתודות(ת אותם המשתנים ואותמכילים את.ז. וכתובת )

.(משתנים, אך אותם שמות וטיפוסי שונים בין אובייקט לאובייקטמשתנים

לרוב, כל מחלקה תישמר בקובץ משלה, כאשר שם הקובץ הוא באותו השם בדיוק כמו שם המחלקה. עם זאת, יכולות

publicלהופיע מס' מחלקות באותו קובץ הקוד, אך יש לזכור שרק אחת המחלקות בקובץ יכולה להיות בעלת מציין הגישה

ואותה מחלקה היא זו ששם הקובץ נקבע לפיה.

תוגדר באופן הבא: מחלקה

public/*(or none for package-friendly)*/ class ClassName { //Class Variables Section //Instance Variables Section //Class Methods Section //Instance Methods Section

}

Page 5: ג'אווה - תכנות מונחה עצמים - מחלקות ואובייקטים

Static Variables –משתנים סטטיים - משתני מחלקה

שאובייקטים שונים ניתן לשייך לקבוצות בעלות מכנה משותף ועבור כל קבוצה להגדיר מחלקה, כך שכל הזכרנו קודם,

אובייקט שייווצר ממחלקה מסוימת, יכיל, בהתאם לעובדה שהוא נוצר מאותה השבלונה, בדיוק את כל אותן התכונות

דות מופע.והפעולות שמוגדרות במחלקה. משתנים ומתודות אלו נקראים כאמור משתני/מתו

לעומתם, קיימים גם משתנים/מתודות סטטיים, אלו לא נוצרים עבור כל אובייקט, אלא פעם אחת עבור המחלקה. משתני

, ומתודות shared resourceמחלקה סטטיים אלו תפקידם להכיל נתונים המאפיינים או משמשים את המחלקה כולה, מעיין

ם כמו מתודות מופע, אלא מבצעות פעולות גלובליות למחלקה.מחלקה סטטיות אינן פועלות על אובייקט מסוי

אם השתמשנו בדוגמה של המפעל שמקבל עובדים לפי טופס עובד קבוע, על מנת להבין מה הם משתנים סטטיים, נמשיך

ובד מנהל המפעל "ספר עובדים", מעת קבלתו של העעם דוגמה זו ונציין פרט שלא הזכרנו קודם: מרגע הקמתו של המפעל,

הראשון, כל עובד, טרם שהתחיל לעבוד במפעל )טרם מילא את הטופס(, מקבל את ספר העובדים, פותח אותו בעמוד

האחרון ומוסיף שורה לפי הפורמט הקיים )מס' סידורי בסדר רץ, שם ושם משפחה(, כך שנניח ואדם בשם רן שמואלי מגיע

ות הבאות:לעבוד במפעל, והשורות האחרונות בספר הן לדוגמה השור

קדמי משה 070

שרון ליאורה 070

השורה שיוסיף רן שמואלי תהיה השורה הבאה:

שמואלי רן 000

לאחר שיזין את הנתונים שהתבקש בספר העובדים, ימלא כרטיס עובד ויהפוך לעובד מן המניין.

העובדים במפעל טרם קבלתו. כמו כן, נבחין בעובדה, שעוד לפני שההפך רן לעובד מן המניין, יכול היה לגשת לנתונים לגבי

יכול לראות כמה עובדים כרגע עובדים במפעל ולהבין איזה מס' עובד יהיה הוא בעצמו )אחד יותר מהאחרון(.

ובאותו האופן, מתנהגים משתני מחלקה. הם בעצם הנתונים של המפעל עצמו )המחלקה(: רשימת העובדים עם מס' העובד

משתנה הסטטי הוא מבנה שמכיל מס' סידורי ושתי מחרוזות(, הם אינם שייכים לעובד ה –)ערכו של המשתנה הסטטי

)גישה למשתנה יכולה ספציפי )לאובייקט ספציפי( והם היו נגישים לכל העובדים במפעל אפילו טרם קבלתם להיות עובדים

להיעשות ישירות דרך המחלקה, אפילו לא דרך מופע מסוים(.

באופן הבא:לפני טיפוס המשתנה בעת ההצהרה עליו, staticע"י הוספת המילה הגדרת משתנה סטטי מתבצעת

class ClassName { //Class Variables Section static String id; //Instance Variables Section //Class Methods Section //Instance Methods Section

}

Page 6: ג'אווה - תכנות מונחה עצמים - מחלקות ואובייקטים

באופן זה, נוצר והוקצה מקום בזיכרון עבור משתנה יחיד, לא משנה כמה אובייקטים ייווצרו מהמחלקה, וכל פניה למשתנה

ההקצאה והיצירה של משתנה/מתודה סטטיים זה ע"י כל אובייקט תתבצע לאותו הרפרנס ומכאן לאותו המקום בזיכרון.

באחת משלוש דרכים: אובייקטים וערכיהם מאותחליםנעשות כבר בזמן הטעינה של המחלקה, עוד לפני יצירת

תוך השמה בעת ההצהרה. ,מפורש-, באופן ידניראשונהה

class ClassName { //Class Variables Section static int num=5; //Instance Variables Section //Class Methods Section //Instance Methods Section

}

זהו בלוק סטטי שנכתב בצורה הבאה: .אתחול למשתנים סטטייםדרך בלוק , השנייה

class ClassName { //Class Variables Section static int num; //Instance Variables Section //Class Methods Section //Instance Methods Section

Static {// בלוק סטטי יכול להופיע בכל מקום בקובץ המחלקה. מחלקה פנימית חייבת להיות סטטית ע"מ שיעשה בה שימוש בבלוק סטטי num=10;

} }

, בהיעדר אתחול מפורש, יאותחלו המשתנים לערכי ברירת המחדל של הטיפוס ממנו נוצרו.השלישית

class ClassName { //Class Variables Section static int num; // 0-במידה ואין אתחול בבלוק סטטי, יאותחל לערך ברירת המחדל בהתאם לטיפוס ובמקרה הזה ל //Instance Variables Section //Class Methods Section //Instance Methods Section

}

כמה(, יבוצעו טרם יצירת בדומה לקדימות בסדר היצירה של משתנים/מתודות סטטיים, גם בלוקי האתחול )יכולים להופיע

, אם אותו משתנה אותחל בכמה בבלוקי אתחול שונים, הערך האחרון האובייקטים, בזמן הטעינה של המחלקה לזיכרון

.שקיבל, הוא זה שיישאר בו

פנייה למשתנה מחלקה תיעשה באחת משתי דרכים:

(objectNameט מהמחלקה בשם ונוצר אובייק ClassNameבמחלקה countX)בהנחה והוגדר משתנה סטטי בשם

:, באם נוצר כזהאובייקט מהמחלקהכל פניה דרך הראשונה,

objectName.countX=10;

:לא דרך אובייקט מסויםו פנייה ישירה למחלקההשנייה, תוך

ClassName.countX=10;

Page 7: ג'אווה - תכנות מונחה עצמים - מחלקות ואובייקטים

Final Static Variables – סופיים סטטיים משתנים

באופן הבא: finalאם נרצה להפוך משתנה סטטי לקבוע, נוכל להוסיף את המילה השמורה

final static int CONSTVAR=5;

כלומר, אתחול בשורת ההצהרה ומאותו הרגע, יש קבוע למחלקה.

נזכור: שמות של קבועים ייכתבו באותיות גדולות, זו הקונבנציה בנושא זה.

רצוי להגדיר קבוע כסטטי )אלא אם כן ערכו משתנה מאובייקט לאובייקט(, אחרת הוא יווצר כל פעם מחדש עבור כל אובייקט

וזה בזבזני מבחינת משאבי זיכרון!

Page 8: ג'אווה - תכנות מונחה עצמים - מחלקות ואובייקטים

המשך -מחלקות

במחלקה ממנה הוא נוצר ועל כן, בבואנו אם כן, בהביטנו על אובייקט מסוים, אנו יכולים לומר אילו תכונות ופעולות מוגדרות

לכתוב קטע קוד של תכנית, רצוי שננסה לדמיין בראשית את האובייקטים שהולכים לשחק תפקיד בתכנית שלנו. לאחר מכן,

לנסות ולהבין מה יהיו תכונותיהם ומהן הפעולות שניתן להפעיל עליהם ומתוך כך, לקבל הבנה של אילו מחלקות יש עלינו

להגדיר.

, , נרצה לדמיין אילו קשרים יהיו בין אובייקטים בתכנית שלנו(function members) ופעולות (data members) בנוסף לתכונות

אובייקט שלם... קשרים אלו הם אותם הקשרים אחרים כחלק מהיותםאילו אובייקטים מכילים אולי אובייקטים כמו כן,

ממנה. שייווצרהקיימים בין המחלקות עצמן, כלומר, יש יחס ליניארי בין הגדרת המחלקה לבין האובייקט

ושם המחלקה newע"י שימוש במילה השמורה מחלקהאותה המ instantiationביצוע כתוצאה מאובייקט נוצר ממחלקה כל

:(ע"י השמה ישירהמערכים ניתן ליצור גם )מחרוזות ו באופן הבא

new ClassName();

המחלקה זיכרון עבור האובייקט החדש, מאתחל אותו באם הוגדר כך בבנאי newמקצה האופרטור instantiation-בתהליך ה

.וזהו הערך שיוכל במשתנהלאובייקט reference חזירמולסיום ובהתאם לפרמטרים שישלחו אליו

ומכאן שהמשתנה אינו מהווה את למרחב הכתובות הפיזיות בזיכרון, בניגוד לשפות אחרות גישה שליטה או אפילואין לנו

מבלי לשמור את ערך החזרה )הרפרנס(, אז new-כמובן שבמקרה שנבצע שימוש ב .האובייקט עצמו, אלא רפרנס אליו

כיאה למשאב שיצא מכלל שימוש. garbage collector-האובייקט שנוצר יהיה חסר גישה ובשל כך, ישוחרר ע"י ה

this

כאשר אנו נמצאים בתחום ההגדרה של המחלקה, יש לנו צורך לעתים לדבר על הרפרנס של האובייקט הנוכחי. זה קורה

, או כאשר אנו מתוך פעולתה של מתודה אחרת כאשר אנו מעוניינים לשלוח את הרפרנס לאובייקט הנוכחי למתודה כלשהי

בתחום הגדרתה של מתודה ונוצרת כפילות שמות בין שם משתנה מקומי של המתודה ושם משתנה של המופע.נמצאים

. במקרה הראשון, פשוט נשלח thisבשני המקרים הללו, אנו נציין את הרפרנס לאובייקט הנוכחי באמצעות המילה השמורה

שם המשתנה כאשר נקודה מפרידה ביניהם לפני thisובמקרה השני נציין את כרפרנס לאובייקט הנוכחי thisאת

יציין שמדובר במשתנה המופע, בעוד this.varName: לומר, ככאינדיקציה לגבי מי מהמשתנים הוא זה שאנו פונים אליו

varName .יציין שמדובר במשתנה המקומי

public class ClassName { int test; public void setTest (int test) { this.test=test; } }

Page 9: ג'אווה - תכנות מונחה עצמים - מחלקות ואובייקטים

Abstract Classes – תואבסטרקטי ותמחלק

בדומה לממשק, מחלקה אבסטרקטית, היא מחלקה שלא ניתן לייצר ממנה מופע.

של מתודות שאינן הוגדרו כאבסטרקטיות.מפורשים מימושים בשונה מממשק, במחלקה אבסטרקטית יכולים להופיע

באופן זה, ניתן להגדיר תבנית כללית, שוב, מעיין שבלונה ליצירת שבלונות, רק ששבלונה מסוג זה לא מהווה רק קווים

, אלאממשק(ה)כפי שנעשה במקרה של תמממשועבור המתודות והמשתנים שצריכים להיות במחלקות הוהצהרות כלליים

.במחלקות היורשות מימושן-ןעבור חלק מהמתודות, היא מהווה גם את אופן הגדרתשכאן,

היות ובכל זאת מדובר במחלקה ולא בממשק, השימוש במחלקה אבסטרקטית ייעשה באמצעות ירושה ממנה )כלומר, לא

-במקביל(, ובמחלקה היורשת, אם זו מחלקה שרוצים לייצר ממנה מופע, חלה חובה לממש נוספות ניתן לרשת ממחלקות

קטיות, אחרת, המחלקה אבסטרמתודות כבה צהרוהוקה האבסטרקטית המורישה והגיעו מהמחלאת כל המתודות ש לדרוס

גם היא. כאבסטרקטיתחייבת להיות מוגדרת היורשת

שורת הגדרתה של מחלקה אבסטרקטית תיראה כך:

public abstract class AbstractClass { public abstract void abstractMethod(); // אבסטרקטית תיראה כך:ובתוכה, מתודה }

מחלקה אבסטרקטית יכולה גם להיות כזו שכל המתודות בה ממומשות באופן מלא. כלומר, אין בה מתודות אבסטרקטיות

מחלקה, אפילו ריקה, שתירש ממחלקה כלל והמגבלה כאן תהיה בכך שלא ניתן לייצר מופע של המחלקה, אך ניתן לייצר

יתן יהיה לייצר.אבסטרקטית זו ומופע שלה כבר נ

Final Classes –מחלקות סופיות

ניתן להגדיר מחלקה כך שלא יהיה ניתן לרשת ממנה ולהרחיב את הגדרתה. מחלקה זו תוכל לרשת ממחלקה אחרת ולממש

ממשק, אך היא תהיה "סוף שושלת הירושה".

ע"מ להפוך מחלקה לסופית יש לבצע הגדרה באופן הבא:

public final class ClassName { }

defined Classes-Pre – מחלקות מוגדרות מראש

מבני נתונים מוכרים ושימושיים, כבר הוגדרו עבורנו בג'אווה כמחלקות, כך שמשתנה מסוג מחלקה שכזו, משמעותו שהוא

וקטור, רשימה מקושרת וכד'. מיועד להחזיק באובייקטים אחרים במבנה מסוים, לדוגמה: ערימה,

להשתמש במבנים אלו ואחרים, יש לייבא את המבנה הרצוי או את כולם מהחבילה:ע"מ

import java.util.*;

באופן הבא: הקיימים, לדוגמה,לאחר הייבוא, ניתן יהיה ליצור אובייקטים מהמבנים

Stack s=new Stack(); Vector v=new Vector(); LinkedList ll=new LinkedList();