[שאלה] טווח ב- java - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

[שאלה] טווח ב- java


evyatar813

Recommended Posts

הקוד הבא:


public class apples {
public static void main(String args[]) {
int bucky[] = {3,4,5,6,7};
change(bucky);

for (int y:bucky)
System.out.println(y);

}

public static void change (int x[]) {
for (int counter=0;counter<x.length;counter++) {
x[counter] += 5;
}
}
}

בסוף התוכנית מדפיסה את המספרים בתוספת ככה שיוצא8 9 10 11 12.

לא הבנתי איך המערך של X בתוך הפונקציה משפיע על המערך bucky שבמתודה הראשית... איך זה קורה? מערך בתוך מתודה לא שייך ל'עולם הפנימי' של המתמודה או משהו כזה?

קישור לתוכן
שתף באתרים אחרים

שאלה יפה.

ב-Java כל האובייקטים וה-primitives עוברים במתודות By Value, כלומר הערך שלהם מועבר למתודה.

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

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

כלומר לא בוצע שכפול של האוביקטים במערך אלה רק למצביע של המערך.

קישור לתוכן
שתף באתרים אחרים

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

(למדתי לפני זה PHP אבל לא נדרש לי שם כל כך מידע מהסוג הזה)...

אם אפשר הסבר לרמה קצת יותר התחלתית זה יתקבל בברכה =]

תודה!

קישור לתוכן
שתף באתרים אחרים

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

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

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

x = new int[10];

כי זה יגרום לכך ש-x יצביע למערך חדש, ולא למערך המקורי.

נ.ב. מה הקשר בין השאלה שלך לבין הכותרת?

קישור לתוכן
שתף באתרים אחרים

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

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

ככה שהשכפול הוא בעצם "משהו" אחר, אבל הדברים שבתוכו הם אותם דברים שהיו בקודם...ככה שהוא לא ממש שכפול אמיתי (deep copy), אלא שכפול רק של השם שלו (shallow copy).

הנה תמונה מעניינת שמצאתי בגוגל:

http://3.bp.blogspot.com/_tdg4nXANbSU/TT7u5OySbOI/AAAAAAAAAzc/UO7oyRXZ8Yk/s1600/shallow_copy.jpg

משמאל מה שחשבת שיקרה, מימין מה שבאמת קורה בג'אווה.

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...