"פוינטרים" ב java - איך עושים את זה במתודות? - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


unknown man

Recommended Posts

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

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

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

תודה רבה :xyxthumbs:

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

אורורה - תודה, הבנתי בערך מה אני לא יכול לעשות, אבל לא ממש הבנתי איך אני כן יכול לעשות את מה שאני רוצה (להעביר סתם 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.

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

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

אני לא כ"כ מבין מה אתם מסתבכים, אם מדובר במשתנה פרימיטיבי (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? :s07:

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

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

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

נדמה לי ש-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 שבועות מאוחר יותר...

ארכיון

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

×
  • צור חדש...