» נושאי לימוד
» נושאי לימוד
יום שני 29 באפריל 2024
שימוש במחלקות System ו‑PrintStream
דף ראשי  מתחילים  שימוש במחלקות System ו‑PrintStream גרסה להדפסה

שימוש במחלקות System ו‑PrintStream

 

 

- מבוא

- הקדמה

- דיון

- מילה בנוגע למשתני-מחלקה

- שאלות סיכום

 


 

  מבוא

סטודנטים בקורס הקדמה לתכנות Java אחראים לידיעת והבנת כל החומר בשעור זה
(חוץ מנושאים ספציפיים ב –
C++).

הנושאים הספציפיים ב – C++ מוצעים כחומר משלים לטובת אלו שמכירים כבר C++
ומבצעים הסבה ל –
Java.

  הקדמה

 

שיעור זה יציג את השימוש במחלקות System ו‑PrintStream ב‑Java. החומר מהווה מבוא ראשוני למורכבוּת הכרוכה בתבנית תכנות מונחה-עצמים.

 

 דיון

מה עושה מתודת ()main?

 

מתודת main במחלקה השולטת של אפליקציות Java שולטת בזרימת התוכנית,
בדומה לאופן שבו פונקציית
main בתוכניות ++C שולטת בזרימת התוכנית בשפת ++C.

 

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

 

האפליקציה hello1

 

להלן מובאת שוב מחלקת hello1.

 

/*File hello1.java Copyright 1997, R.G.Baldwin
**********************************************************/
class hello1 { //define the controlling class
  //define main method
  public static void main(String[] args){
    //display text string
    System.out.println("Hello World");
  }//end main
}//End hello1 class.  No semicolon at end of Java class.

 

 האם תוכנית זו יוצרת אובייקטים?

 

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

 

האם התוכנית ניגשת למחלקות אחרות?

 

עם זאת, היא אמנם ניגשת למחלקה אחרת, מחלקת System, אשר מסופקת יחד עם ה‑JDK (מחלקת System תידון בפירוט בהמשך).

 

משתנה out

 

משתנה out, המצוין לעיל כ‑System.out, הוא משתנה של מחלקת System.

 

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

 

משתנים פרימיטיביים לעומת משתני-הצבעה

 

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

 

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

 

גישה למשתני-מחלקה

 

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

 

ב‑Java, System.out ניגש למשתנה-המחלקה בשם out במחלקה בשם System.

 

אופרטור scope resolution ב‑++C

 

מתכנתי ++C מכירים את האופרטור scope resolution (::), המשמש ב‑++C על מנת לגשת למשתני-מחלקה ולמתודות-מחלקה.

 

מחלקת PrintStream

 

מחלקה נוספת, המסופקת יחד עם ה‑JDK, היא מחלקת PrintStream. מחלקה זו נכללת בחבילה של מחלקות, המשמשות כדי לאפשר ל‑Java יכולת זרימת קלט/פלט.

 

על מה מצביע המשתנה out?

 

משתנה out במחלקת System מצביע על הֵדגֵם של מחלקת PrintStream

(אובייקט PrintStream), הנוצר אוטומטית כאשר מחלקת System נטענת לתוך האפליקציה.

 

דבר זה מקביל למדי לעובדה, שב‑++C אובייקטֵי זרימת הקלט והפלט, cin ו‑cout, נוצרים
ומקושרים אוטומטית להתקני הקלט/פלט הסטנדרטיים כאשר מתחיל ביצוע של תוכנית
++C.

 

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

 

מתודת println()

 

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

 

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

 

גישה למתודת-הֵדגֵם

 

בדומה לאופן, שבו ניגשים בדרך כלל ב‑Java למשתני-הֵדגֵם, ניתן גם לגשת למתודת println() באמצעות חיבור שמו של המשתנה המצביע על אובייקט מטיפוס PrintStream לשמה של המתודה, כשהם מופרדים בנקודה.

 

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

 

System.out.println("Hello World");

 

 

ההצהרה מפעילה את מתודת println() של אובייקט של מחלקת PrintStream, שעליו מצביע המשתנה out שהוא משתנה-מחלקה של מחלקת System.

 

 מילה בנוגע למשתני-מחלקה

 

 

כמה הֵדגֵמִים של משתנה-מחלקה קיימים?

 

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

 

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

 

גישה למשתנה-מחלקה

 

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

 

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

 

מתודות של הצבעות על אובייקט באמצעות משתני-מחלקה

 

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

 

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

 

משתני-הֵדגֵם ומתודות-הֵדגֵם

 

נוסף על משתני-מחלקה, הן ++C והן Java מספקות משתני-הֵדגֵם ומתודות-הֵדגֵם. כל הֵדגֵם של מחלקה הוא בעל מערכת של משתני-הֵדגֵם משלו. למשתני-הֵדגֵם ולמתודות-הֵדגֵם ניתן לגשת רק מתוך אובייקט של המחלקה.

 

שאלות סיכום

 

ש: האם מתודת main במחלקה השולטת של אפליקציית Java שולטת בזרימת התוכנית?

 

ת: כן.

 

ש: האם נכון שמתודת main אינה מסוגלת לגשת למשתנים ולמתודות של אובייקטים, שנוצרו מתוך מחלקות אחרות?

 

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

 

ש: האם מתודת main נדרשת ליצור אובייקטים של מחלקות אחרות לשם ביצוע התוכנית?

 

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

 

ש: האם על מנת להשתמש במחלקת System, יש צורך ליצור אובייקטים שלה?

 

ת: לא. מחלקת System כוללת מספר משתני-מחלקה (בין היתר, in ו‑out), שניתן להשתמש בהם מבלי ליצור אובייקט של מחלקת System.

 

ש: האם משתני-מחלקה, כמו משתנה out של מחלקת System, חייבים להיות מטיפוס מוגדר כלשהו?

 

ת: כן.

 

ש: האם משתני-מחלקה חייבים להיות מטיפוס פרימיטיבי כגון int או float?

 

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

 

ש: האם משתנה out במחלקת System הוא מטיפוס פרימיטיבי?

 

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

 

ש: אל מה ניגש קטע הקוד System.out?

 

ת: קטע הקוד System.out ניגש למשתנה-המחלקה בשם out במחלקה בשם System.

 

ש: האם אובייקט מטיפוס PrintStream נוצר אוטומטית כאשר מחלקת System נטענת לתוך האפליקציה?

 

ת: כן.

 

ש: על ההֵדגם של איזו מחלקה מצביע המשתנה out במחלקת System?

 

ת: המשתנה out במחלקת System מצביע על הֵדגם של מחלקת PrintStream
(אובייקט
PrintStream) אשר נוצר אוטומטית כאשר מחלקת System נטענת לתוך האפליקציה.

 

ש: מתודת println הינה הֵדגם של איזו מחלקה?

 

ת: מתודת println היא הֵדגם של מחלקת PrintStream.

 

ש: מהי ההתנהגות העיקרית של מתודת println?

 

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

 

ש: כיצד ניתן לגשת למתודת println?

 

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

 

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

 

ת               

   

System.out.println("Dick Baldwin");                         

 

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

 

ת: ההוראה מפעילה את מתודת println של אובייקט של מחלקת PrintStream, אשר עליו מצביע המשתנה out, שהוא משתנה-מחלקה של מחלקת System.

 

ש: אם ישנה מחלקה בשם MyClass, בעלת משתנה-מחלקה בשם myClassVariable הדורש 4 בייטים של זיכרון, והמתכנת יוצר 10 אובייקטים מטיפוס MyClass, מהו סך כל הזיכרון שיוקצה למשתנים המוקצים (בהנחה שהגדרת המחלקה אינה מכילה מחלקות, הדגמים או משתנים מקומיים נוספים)?

 

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

 

ש: בקטע הקוד

                                                                                                                                                              System.out.println("Dick Baldwin");    

     

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

 

ת: רק אחד, משום ש‑out הוא משתנה-מחלקה של מחלקת System.

 

ש: אם ישנה מחלקה בשם MyClass, בעלת משתנה-הֵדגֵם בשם myInstanceVariable הדורש 4 בייטים של זיכרון, והמתכנת יוצר 10 אובייקטים מטיפוס MyClass, מהו סך כל הזיכרון שיוקצה כדי להכיל את המשתנים המוקצים (בהנחה שהגדרת המחלקה אינה מכילה מחלקות, הדגמים או משתנים מקומיים נוספים)?

 

ת: כל הֵדגֵם של מחלקה הוא בעל מערכת משתני-הֵדגֵם משלו. למשתני-הֵדגֵם ולמתודות-הֵדגֵם ניתן לגשת רק באמצעות אובייקט של המחלקה. במקרה זה יידרשו 40 בייטים של זיכרון על מנת להכיל את משתני-ההֵדגֵם של עשרת האובייקטים.

 

 17-12-03 / 20:06  נוצר ע"י רונית רייכמן  בתאריך 
 מתודת ()main - הקודםהבא - מבוא לממשק משתמש גרפי (GUI) 
תגובות הקוראים    תגובות  -  0
דרכונט
מהי מערכת הדרכונט?
אינך מחובר, להתחברות:
דוא"ל
ססמא
נושאי לימוד
חיפוש  |  לא פועל
משלנו  |  לא פועל
גולשים מקוונים: 3