עבור לתוכן

"פוינטרים" ב java - איך עושים את זה במתודות?

Featured Replies

פורסם

שאלה מצחיקה אבל אפילו שדי התקדמתי ב java אני לא מוצא פיתרון -

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

אם זה לא מובן, אני מתכוון כמו בפסקל שמשתמשים ב var בשורת הפרמטרים בפרוצדורות (כמו procedure a(var i:integer);)

תודה רבה :xyxthumbs:

פורסם

תעשה את זה static

פורסם
  • מחבר

אורורה - תודה, הבנתי בערך מה אני לא יכול לעשות, אבל לא ממש הבנתי איך אני כן יכול לעשות את מה שאני רוצה (להעביר סתם intים ולשנות אותם בפשטות)

דרור - איפה static?

קוד כמו:

class test {

static void meth(int i) {
i+=1;
}

public static void main(String[] args) {
int x = 1;
meth(x);
System.out.println(x);

}

}

עדיין יחזיר 1

מצד שני, אם משנים את int למערך (int[]), זה עובד יופי.. X:

פורסם

int זה טיפוס בסיסי לכן אף פעם לא יהיה אליו רפרנס. לעומת זאת מערך int[] הוא אוביקט לכל דבר ועניין, כלומר אתה מעביר למתודה עותק של רפרנס למערך. כאשתה משנה את תוכנו בתוך המתודה, הערך משתנה גם בmain.

בדיוק בשביל להתגבר על הבעיה שאתה מציג פה המציאו את Wraper Classes והם: Integer, Byte, Boolean וכו'. אם לא הכרתה אותם עד עכשיו, עדיף מאוחר מאשר אף פעם לא.

בקיצור הקוד שלך יראה כך:


class test {

static void meth(Integer i) {
i++;
}

public static void main(String[] args) {
Integer x = new Integer(1);
meth(x);
System.out.println(x);

}

}

שכחתי לציין שהעבודה עם Wraper Classes כמעט זהה לעבודה עם משתנים בסיסיים. אבל הוסיפו להם מלא תכונות שלא יכולת לצפות ממשתנה בסיסי. הדוגמא הכי טובה זה parsing.

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

פורסם
  • מחבר

תודה על התגובה המעמיקה, אבל - כבר הכרתי והתנסיתי עם ה Wrappers,

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

פורסם

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

class test {

int i=1;

public void meth() {
i+=1;
}

public static void main(String[] args) {

meth();
System.out.println(i);

}

}

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

פורסם

תודה על התגובה המעמיקה, אבל - כבר הכרתי והתנסיתי עם ה Wrappers,

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

נדמה לי ש-Integer הוא immutable - אי אפשר לשנות את הערך שלו מהרגע שבנית אותו. כמו String.

פורסם

תעשה את זה static

איך לעזאזל יעזור לו static? :s07:

פורסם

איך לעזאזל יעזור לו static? :s07:

אני חושב שהוא התכוון לglobal, או אם לדבר במונחים של oo, אז הכוונה היא data member שמוגדר בתוך המחלקה, ואז כל המתודות יכולות לגשת אליו.

אבל פה כבר צריך לשאול את השאלה אם לוגית זה נכון לשים את המשתנה כdata member.

פורסם

public static int i=5;

אם תגדיר אותו ככה תוכל גם לגשת אליו מתוך מחלקות אחרות.

פורסם

נדמה לי ש-Integer הוא immutable - אי אפשר לשנות את הערך שלו מהרגע שבנית אותו. כמו String.

אתה צודק!

אבל, מסתבר שבכל זאת יש דרך להתגבר על זה: "Atomic Wrapper Classes". מצרף לינק מוויקיפדיה: http://en.wikipedia.org/wiki/Primitive_wrapper_class

פורסם
  • מחבר

^

בדקתי את זה - קצת מסבך ;D

הקוד יוצא למשל:

import java.util.concurrent.atomic.AtomicInteger;

class test {

static void meth(AtomicInteger i) {
i.set(i.intValue()+ 1);
}

public static void main(String[] args) {
AtomicInteger i = new AtomicInteger(1);
meth(i);
System.out.println(i);

}

}

אי אפשר לעשות עליהם autoboxing/unboxing :x

ד"א תודה לכולם.. השכלתי :jump:

פורסם

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

  • 3 שבועות מאוחר יותר...
פורסם

אפשר כמובן להשתמש בשפה נורמלית כמו C# ששם יש הגדרה ref שמאפשרת להעביר משתנים by reference לפונקציות.

ארכיון

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

דיונים חדשים