Java/שיטות: הבדלים בין גרסאות בדף

תוכן שנמחק תוכן שנוסף
Johnny Zoo (שיחה | תרומות)
שורה 89:
מה תדפיס התוכנית? נסו לנחש, ואז הריצו אותה. הניחוש היה, קרוב לוודאי, שהפלט יהיה {{פלט|A is 3, B is 4}}
למעשה הפלט היה {{פלט|A is 1, B is 2}}
האם המהדר דילג על ביצוע השיטה? כדי להבין את התנהגות התוכנית, נצטרך להכיר מונח חדש - תחום ההגדרה של המשתנים, ולהבין כיצד עובד המנגנון של קריאה לשיטה.
 
===תחום ההגדרה של משתנים מקומיים===
לכל משתנה בג'אווה תחום הגדרה מסויים. משתנה שנוצר בתוך לולאה - יהיה קיים רק בתוך הלולאה. משתנה שנוצר בתוך שיטה - יהיה קיים רק עבור אותה שיטה. אם ננסה לפנות אל המשתנה ממקום אחר בתוכנית שנמצא מחוץ לתחום ההגדרה - המחשב יתנהג כאילו המשתנה לא קיים, והמשתמע מכך - התוכנית לא תעבור הידור. יותר מכך: גם משך החיים של המשתנים המקומיים האלה מוגבל לתחום ההגדרה - כאשר מסתיים הבלוק בו הגדרנו את המשתנה, הערך שהיה במשתנה אובד. למשל - אם הגדרנו משתנה מקומי בתוך שיטה, עם סיום פעולת השיטה - הערך שהיה בתוך המשתנה "נשכח" - נעלם. בפעם הבאה שנקרא לאותה שיטה, אותו משתנה לא ישמור על ערכו אלא יחזור לערך האיתחול שלו.

===משתנים מקומיים וקריאה לשיטות===
כאשר אנו קוראים לשיטה חיצונית עם משתנים מקומיים בתור פרמטרים, המשתנים המקומיים עצמם אינם עוברים כפרמטרים. במקום זה, לאנוצרים הכל:עותקים של המשתנים האלו והם אלו שמועברים אל השיטה. לכן, גם אם ניקח משתנים מקומיים ונבצע עליהם פעולות בעזרת שיטות חיצוניות - ערכם לא ישתנה. המשתנים שתקבל השיטה החיצונית בתור ערכי קלט הם למעשה העתקים של המשתנים המקומיים שהיצבנו, בעוד ערך המשתנים המקוריים נשאר כשהיה. זו הסיבה לכך שהתוכנית הקודמת התנהגה בצורה כה מוזרה - המשתנים a ו-b עליהם פעלה השיטה {{קוד בשורה|manipulate}} והמשתנים a ו-b ב-main הם שונים, ולמעשה - לא ביצענו על המשתנים שב-main שום פעולה.
 
שיטת עבודה זו מכונה '''Pass by Value''' (בניגוד ל-Pass by Reference).
 
===משתנים גלובליים===