פורסם 2008 בינואר 517 שנים שאלה מצחיקה אבל אפילו שדי התקדמתי ב java אני לא מוצא פיתרון - אני מחפש איך עושים שמתודה מסויימת תקבל משתנה, תשנה אותה בקטע קוד, וזה ישתנה גם בצד של הקוד שקרא למתודה אם זה לא מובן, אני מתכוון כמו בפסקל שמשתמשים ב var בשורת הפרמטרים בפרוצדורות (כמו procedure a(var i:integer) תודה רבה
פורסם 2008 בינואר 517 שנים java לא יודעת להעביר משתנים ByRef (שזה מה שאתה רוצה שהיא עתשה), java יודעת להעביר משתנים רק ByVal.לעוד מידע...http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html
פורסם 2008 בינואר 517 שנים מחבר אורורה - תודה, הבנתי בערך מה אני לא יכול לעשות, אבל לא ממש הבנתי איך אני כן יכול לעשות את מה שאני רוצה (להעביר סתם 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:
פורסם 2008 בינואר 617 שנים 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.בקיצור, שוב אם אתה לא הכרת את זה, כדאי מאוד לקרוא עליהם.
פורסם 2008 בינואר 617 שנים מחבר תודה על התגובה המעמיקה, אבל - כבר הכרתי והתנסיתי עם ה Wrappers,וגם ניסיתי להשתמש בהם כמו שאתה השתמשת בהם (עוד לפני שפתחתי את הת'רד), אבל זה עדיין מחזיר אותו ערך
פורסם 2008 בינואר 617 שנים אני לא כ"כ מבין מה אתם מסתבכים, אם מדובר במשתנה פרימיטיבי (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), ולכן כל שינוי שתעשה בפונקציה ישפיע על המשתנה עצמו.
פורסם 2008 בינואר 617 שנים תודה על התגובה המעמיקה, אבל - כבר הכרתי והתנסיתי עם ה Wrappers,וגם ניסיתי להשתמש בהם כמו שאתה השתמשת בהם (עוד לפני שפתחתי את הת'רד), אבל זה עדיין מחזיר אותו ערךנדמה לי ש-Integer הוא immutable - אי אפשר לשנות את הערך שלו מהרגע שבנית אותו. כמו String.
פורסם 2008 בינואר 717 שנים איך לעזאזל יעזור לו static? אני חושב שהוא התכוון לglobal, או אם לדבר במונחים של oo, אז הכוונה היא data member שמוגדר בתוך המחלקה, ואז כל המתודות יכולות לגשת אליו. אבל פה כבר צריך לשאול את השאלה אם לוגית זה נכון לשים את המשתנה כdata member.
פורסם 2008 בינואר 817 שנים public static int i=5;אם תגדיר אותו ככה תוכל גם לגשת אליו מתוך מחלקות אחרות.
פורסם 2008 בינואר 817 שנים נדמה לי ש-Integer הוא immutable - אי אפשר לשנות את הערך שלו מהרגע שבנית אותו. כמו String.אתה צודק!אבל, מסתבר שבכל זאת יש דרך להתגבר על זה: "Atomic Wrapper Classes". מצרף לינק מוויקיפדיה: http://en.wikipedia.org/wiki/Primitive_wrapper_class
פורסם 2008 בינואר 817 שנים מחבר ^ בדקתי את זה - קצת מסבך ;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 ד"א תודה לכולם.. השכלתי
פורסם 2008 בינואר 817 שנים ד"א בקשר ל- Static שהצעתי קודם, בדקתי את זה עכשיו וזה יעזור לך רק אם אתה לא צריך להכניס פרמטר למת'ודה, או אם אתה רוצה להפעיל את הפונקציה מתוך מחלקה אחרת. סליחה אם בלבלתי אותך.
פורסם 2008 בינואר 2917 שנים אפשר כמובן להשתמש בשפה נורמלית כמו C# ששם יש הגדרה ref שמאפשרת להעביר משתנים by reference לפונקציות.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.