JavaRush /בלוג Java /Random-HE /העברת פרמטרים ב-Java
vincent_vega
רָמָה
Gainesville

העברת פרמטרים ב-Java

פורסם בקבוצה
משתנה ב-Java הוא מיכל עם ערך בתוכו. אז מה זה אומר "לעבור" משתנה? ומה ההבדל בין סוגי נתונים פרימיטיביים וריפרנסים.
העברת פרמטרים ב-Java - 1
נגיע לזה מאוחר יותר. נתחיל קודם במשימה פשוטה. מה הקוד הזה עושה:
int х = 3;
int у = х;
בשורה 1 נוצר משתנה x מסוג int ומקבל את הערך 3. בשורה 2 נוצר משתנה y מסוג int ומקבלים את הערך של משתנה x . בעתיד, המשתנה x לא משפיע על y בשום צורה . Java מעתיקה את הערך של x (3) וממקמת את זה ל- y . זה העברת פרמטר לפי ערך. אתה לא כותב משתנה אחד למשנהו. הערך מועתק ומוקצה למשתנה חדש. ביטוי y = x; אין פירושו "כתוב x ל- y ". זה אומר "העתק את הערך בתוך x וכתוב את העותק הזה ל- y ." אם מאוחר יותר אשנה y :
у = 34;
האם זה ישפיע על x ? ברור שלא. ל-x עדיין יש את הערך 3. אם אשנה את x מאוחר יותר :
х = 90;
איך זה ישפיע על y ? אין סיכוי. הם אינם קשורים בשום צורה לאחר ביצוע ההקצאה (העתקת הערך). מה לגבי סוגי הפניות? איך הם עובדים? לא כל כך קשה, למעשה הכלל זהה. קישורים עושים את אותו הדבר - אתה מקבל עותק של הקישור. אז אם אני אומר:
Cat A = new Cat ();
Cat B = A;
קישור א' מועתק לקישור ב'. זה לא חל על האובייקט - עדיין יש לך רק אובייקט אחד. אבל עכשיו יש לך שתי הפניות שונות השולטות באותו אובייקט Cat . עכשיו בואו נסתכל על העברת פרמטרים לשיטות. Java מעבירה פרמטרים לפי ערך. תמיד. המשמעות היא "העתק את הערך והעביר את העותק". עבור טיפוסים פרימיטיביים זה קל:
int х = 5;
doStuff (х); / / Передать копию х (meaning 5) в метод doStuff
שיטת doStuff נראית כך:
void doStuff (int у) {

   / / Действия с 'y'
}
עותק של הערך של x , כלומר 5, מועבר לשיטת doStuff() . למתודה doStuff() יש משתנה משלה שנקרא y . המשתנה y הוא משתנה חדש ושונה. עם עותק של מה שהיה ב- x בזמן העברתו לשיטה. מעתה, y ו- x לא משפיעות זה על זה. כאשר אתה משנה את y , אתה לא משפיע על x .
void doStuff (int у) {

   у = 27; / / Это не влияет на 'х'
}
ולהיפך - אם תשנה את x , לא תשנה את y . הדבר היחיד ש-x עשה במקרה זה היה להעתיק את הערך שלו ולהעביר אותו לשיטת doStuff() . איך עובד "לעבור ערך" עם הפניות? יותר מדי אנשים אומרים, "ג'אווה מעבירה טיפוסים פרימיטיביים לפי ערך ואובייקטים לפי התייחסות." זה לא מה שהם אומרים. Java מעבירה הכל לפי ערך. עם פרימיטיבים, אתה מקבל עותק של התוכן. עם קישורים מקבלים גם עותק של התוכן. אבל מה התוכן של הקישור? שלט רחוק. מתקנים לניהול/גישה למתקן. כאשר אתה מעביר הפניה לאובייקט לשיטה, אתה מעביר עותק של ההפניה. שיבוט שלט רחוק. החפץ עדיין יושב בערימה שבה הוא נוצר ומחכה שמישהו ישתמש בשלט הרחוק. למתקן לא אכפת כמה שלטים "מתוכנתים" לשלוט בו. האנשים היחידים שאכפת להם מזה הם אספן האשפה ואתה, המתכנת. אז כשאתה אומר:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   / / Использование B
}
יש רק חפץ אחד של חתול . אבל עכשיו שני שלטים (קישורים) יכולים לגשת לאותו אובייקט Cat . אז עכשיו כל מה ש- B יעשה לאובייקט החתול ישפיע על החתול שעליו הצביע A , אבל זה לא ישפיע על התוכן של A ! אתה יכול לשנות את החתול באמצעות הקישור החדש ב' (שהועתק ישירות מ- A ), אבל אתה לא יכול לשנות את A. מה לעזאזל זה אומר? אתה יכול לשנות את האובייקט שאליו A מתייחס , אבל אתה לא יכול לשנות את ההפניה של A - הפנה אותו לאובייקט אחר או ל-null . אז אם תשנה את ההתייחסות של B (לא את עצם החתול ש- B מפנה אליו, אלא את הערך של הפניה עצמה) לא תשנו את הערך של A. ולהיפך. כך:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   B = new Cat (); / / Не повлияет на ссылку A
}
זה פשוט אומר ש- B מצביע על אובייקט אחר. א ' עדיין מאושר. אז חזור אחרי: ג'אווה מעבירה הכל לפי ערך. (בסדר, עוד פעם... עם תחושה.) ג'אווה מעבירה הכל לפי ערך. עבור טיפוסים פרימיטיביים אתה מעביר עותק של הערך הנוכחי, עבור הפניות לאובייקט אתה מעביר עותק של הפניה (שלט רחוק). אתה אף פעם לא עובר את החפץ. כל החפצים מאוחסנים בערימה. תמיד. עכשיו רקחו כוס קפה כבדה ותכתבו קצת קוד! מאמר מקורי .
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION