עבור לתוכן

שאלה בסיסית ב-JAVA-השמת עצמים

Featured Replies

פורסם

שלום לכולם, רק התחלתי ללמוד מספר JAVA לפני כמה ימים ולא כ"כ הבנתי אם אני יכול ליצור שני עצמים ולהציב עצם אחד בשני לדוגמא:

Class X כלשהו

X p1=new X;

X p2= new X;

האם ניתן לרשום p1=p2 ולהציב עצם אחד בשני ואם כן מה למעשה תעשה הפעולה הזאת?

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

פורסם

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

הפעולה p1=p2 גורמת לכך ש-p1 ו-p2 למעשה יצביעו על אותו אובייקט - כלומר, כל שינוי שתבצע עכשיו ב-p1 ישפיע גם על p2.

אותו הדבר נכון לגבי מערכים. לדוגמה, בקטע הקוד הבא:

int[] arr1 = new int[5];
arr1[0] = 0;
int[] arr2 = arr1;
arr2[0] = 1;
System.out.println(arr1[0]);

התכנית תדפיס 1, כי שני המשתנים (arr1 ו-arr2) מצביעים על אותו המערך.

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

פורסם
  • מחבר

קודם כל תודה רבה עזרת לי מאוד. רק רציתי לשאול במקרה ואני רוצה להעתיק עצם אחד לשני ואני רוצה שהם לא יהיו תלויים אחד בשני אז אני צריך לעבוד כמו במערך וללכת משתנה/עצם אחד אחד ולהעתיק אותם בין p1 ל-p2?

וד"א שמדובר בדר"כ בפונקציית "בנאי" אז אין ממש בעיה אם זה שאחד הפרמטרים(במידה והוא מערך של עצמים או עצם) למעשה יחלקו את אותו העצם/מערך כלומר שיצביעו על אותו מערך/עצם למעשה השמה רגילה בלי לעבור משתנה משתנה ?

פורסם

יש בד"כ פוקציית clone שעושה העתקה של הדברים במקומך.

פורסם

בשביל להעתיק אובייקטים, יש כמה פתרונות:

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

2. חלק מהאובייקט מממשים copy constructor, כלומר בנאי שמקבל אובייקט מאותו טיפוס ומעתיק אותו, ככה:

X p2 = new X(p1);

פורסם

ה clone בד"כ מבצע shallow copy ואל deep copy שזה שהוא עובר על האלמנטים השונים ומעתיק רק את המבנה העליון שלהם מחדש ולא את כל התתי מבנה שלהם באופן רקורסיבי (שזה deep copy).

פורסם
  • מחבר

ה clone בד"כ מבצע shallow copy ואל deep copy שזה שהוא עובר על האלמנטים השונים ומעתיק רק את המבנה העליון שלהם מחדש ולא את כל התתי מבנה שלהם באופן רקורסיבי (שזה deep copy).

אם הוא מבצע shallow copy למה למעשה לא ניתן פשוט לרשום p1=p2 כאשר אלה שני העצמים?
פורסם
  • מחבר

אוקיי אני אעבור על זה תודה לכם :xyxthumbs:[br]פורסם בתאריך: 15.08.2008 בשעה 13:44:09


אוקיי יש לי דוגמא נגיד ואני רוצה ליצור מחלקה circle ואני רוצה ליצור לה מתודת "בנאי" כזאת לדוגמא:

public circle(point c, int r) {
center=c
radius=r;
}

אז למעשה המתודה מקבלת עצם c מסוג point ומציבה את העצם c בעצם center. זה למעשה כאן מה שהוא עושה זה הוא מציב את המצביע של c ב-center ולמעשה שניהם מצביעים כרגע על אותו העצם? זה העיקרון מאוחרי זה? תודה.

פורסם

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

פורסם
  • מחבר

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

אוקיי הבנתי תודה שוב :)

ארכיון

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

דיונים חדשים