|
הגדרת מחלקות ויצירת עצמים
הגדרת המחלקה תעשה ע"י שימוש במילה השמורה class ואחריה, בתוך סוגריים מסולסלים, יוגדרו תכונות המחלקה והפעולות שבה (ע"י פונקציות).
הסבר:
יצירת עצמים
יצירת עצמים בג'אווה כוללת שני שלבים:
כלומר, הגדרנו מופעים p1,p2 של המחלקה person ומופע volvo של המחלקה car. 2. הקצאת העצם - הקצאת העצם תעשה ע"י הוראת new.
אפשר לשלב את שני השלבים לשלב אחד:
בקרת גישה
ג'אווה, כרוב השפות המודרניות, מאפשרת לנו להגן על המידע שלנו ע"י הגבלת הגישה למשתנה או לפונקציה שישנה במחלקה שלנו, ע"י שימוש באחת מארבע מילים שמורות, לפני הגדרתם בפונקציה.
האפשרות השלישית - package - היא ברירת המחדל (כל מחלקה בקובץ מסוים נחשבת באותה חבילה).
אתחול עצמים - constructor
אפשר לאתחל עצם ע"י שימוש ב- constructor. זוהי פונקציה ששמה בדיוק כשם המחלקה, היא אינה מחזירה ערך - אבל יכולה לקבל פרמטרים, ומתבצעת אוטומטית בעת יצירת העצם.
קריאה ל constructor
ניצור עצם מסוג car במחלקה הראשית (נקרא לה world) וניתן לו פרמטרים מיידית לאתחול.
הצהרנו על מערך של עצמים מסוג car ואתחלנו בעזרת ה constructor את העצמים. כעת יש שני עצמים בתוכנית מסוג car עם הערכים המתאימים שאתחלנו. העמסת ה constructor
העמסת פונקציות הינה אפשרות לתת אותו שם למספר פונקציות, שההבדל ביניהן יהיה בפרמטרים שבקריאה לפונקציה. המחשב יזהה קריאה לפונקציה לפי מספר הערכים שהפונקציה תשלח בקריאה וסוגם.
הוספנו עוד פונקצית constructor, כך שקריאה לפונקציה עם 2 ארגומנטים בלבד תתן ברירת מחדל, שהמכונית יוצרה בשנת 2001. כך תיראה הקריאה לפונקציה מהמחלקה הראשית:
שוב נוצרו לנו שני עצמים מסוג car, כשהפעם עצם אחד אותחל ע"י הקונסטרקטור הראשון וקיבל את ערך year מהאתחול ע"י המתכנת, בעוד שהעצם השני אותחל ע"י הקונסטרקטור השני, וקיבל את הערך year מברירת המחדל שלו. constructor מחדל אם לא הוגדר קונסטרקטור, המהדר מגדיר בעצמו קונסטרקטור ריק שאינו מבצע דבר, והגדרת קונסטרקטור ע"י המתכנת דורסת (כלומר מחליפה אותה בפונקציה עם ערכים - override) את הפונקציה המקורית. המתכנת יכול עדיין להגדיר קונסטרקטור שלא מקבל פרמטרים בכלל, ולתת ערכי מחדל לכל עצם שיווצר, ע"י פונקצית האתחול. constructor העתקה
אפשר לבנות קונסטרקטור מיוחד, שיעתיק ערכי עצם אחד מסוג מסוים לעצם חדש מאותו סוג.
המצביע this
לכל עצם שאנחנו יוצרים יש פוינטר this, שנוצר איתו ביחד אוטומטית ע"י המהדר. שימוש בפוינטר העצמי הזה יכול להעשות בקריאה ל constructor מתוך constructor.
חסכנו כתיבת קוד, ע"י קריאה של קונסטרקטור אחד למשנהו.
פונקצית סיום - destructor
כל מקום בזיכרון, שניתפס ע"י המתכנת, צריך להשתחרר עם סיום התוכנית. בניגוד להרבה שפות אחרות, בג'אווה אין צורך לעשות את זה במפורש, מאחר וקיים מנגנון אוטומטי שדואג לשחרור הזיכרון: ה garbage collector.
השימוש העיקרי של הפונקציה יהיה לשחרר משאבים, כגון קבצים, וכן לאפשר לעצם שמסיים את חייו לדווח על כך. אם רוצים לקבוע במדויק את זמן השחרור של המשאב (השחרור מתבצע ע"י המנגנון האוטומטי וא"א לדעת מתי ואם זה יתבצע), אפשר לקרוא לפונקצית ( )System.runFinalization, שתורה למכונת הג'אווה לבצע את כל פונקציות ה finalize שמטפלות בעצמים שאינם בשימוש בתוכנית, או, לחילופין, לקרוא לפונקצית (System.runFinalizersOnExit(true שתורה למכונת הג'אווה לקרוא לכל פונקציות הסיום עם תום התוכנית. אפשרות זו מומלצת פחות, מכיוון שהיא איננה בטוחה.
חברי מחלקות סטטיים משתנה סטטי
כל תכונה שניתן למחלקה כלשהי, תשוכפל לכל עצם בנפרד. כלומר, אם נצהיר על שני עצמים מאותה מחלקה, כל אחד מהם יקבל את כל המשתנים של אותה מחלקה. בניגוד לזה, אפשר להצהיר על משתנה מסוג static, שלא יווצר לכל עצם, אלא יהיה שייך למחלקה עצמה (ולא לעצמים) ולכן התכונות שלו יהיו תכונות מחלקתיות. אם במופע כלשהו של המחלקה ישתנה הערך של משתנה סטטי - הוא ישתנה עבור כל המופעים בהתאם.
הוספנו משתנה מסוג static int לתכונות המחלקה. כל קריאה לעצם חדש מסוג car תגרום, ע"י הקונסטרקטור, לעלייתו של המשתנה הסטטי באחד וכך נוכל לעקוב בתוכנית כמה עצמים בדיוק מסוג car קיימים כרגע בתוכנית. פונקציות סטטיות
בדומה למשתנה סטטי, גם על פונקציה סטטית נצהיר בעזרת המילה static. פונקציה סטטית מאפשר גישה אך ורק לעצמים מסוג סטטי, ששייכים לתכונות המחלקה. לדוגמא, נהפוך את ה counter ל private, ע"מ לשמור על הגישה אליו, ונוסיף פונקציה סטטית שתקרא את תכונות ה counter:
|
|||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
|