להגדרת משתנה פשוט.אך לא זהה,הגדרת משתנה עצם דומה, להבדל יש משמעויות חשובות.
כדי להבין אותו נחזור לטבלת המשתנים.
Dog לטיפוס העצם מהמחלקה intנשווה בין הטיפוס הפשוט
בונה חדש: Dogלשם כך נוסיף למחלקה
public Dog(String name) { this(name,HAPPY);}
ושיטות חדשות:public String get_name() { return name;} public void set_name(String name) { this.name = name;}
יראו הזיכרון וטבלת המשתנים כך: ;int iאחרי בצוע הפקודה1.
הפניהטפוסמשתנהiint
טבלת משתנים זיכרון
יראו הזיכרון וטבלת המשתנים כך: ;i = 1. אחרי בצוע הפקודה2
הפניהטפוסמשתנהiint
טבלת משתנים זיכרון
1
יראו הזיכרון וטבלת המשתנים כך: ;int j. אחרי בצוע הפקודה3
הפניהטפוסמשתנהiint
jint
טבלת משתנים זיכרון
1
יראו הזיכרון וטבלת המשתנים כך: j = i . אחרי בצוע הפקודה4
הפניהטפוסמשתנהiint
jint
טבלת משתנים זיכרון
1 1
i שהיה במקום עליו מצביע הערך.j למקום עליו מצביע הועתק
יראו הזיכרון וטבלת המשתנים כך: ;j = 2 . אחרי בצוע הפקודה5
הפניהטפוסמשתנהiint
jint
טבלת משתנים זיכרון
1 2
System.out.println(“i = “+i+” “+ ”j = “+j);
יצור פלט:i = 1 j = 2
יראו הזיכרון וטבלת המשתנים כך: ;Dog my_dog. לעומת זאת, אחרי בצוע הפקודה 6
הפניהטפוסמשתנהiint
jint
טבלת משתנים זיכרון
1 2
שום מקום לא הוקצה בזיכרון
my_dogDog
. ; my_dog = new Dog(“Rex”). זיכרון יוקצה רק בבצוע הפקודה 7
הפניהטפוסמשתנהiint
jint
טבלת משתנים זיכרון
1 2
my_dogDogRex
8 .Dog your_dog ;
הפניהטפוסמשתנהiint
jint
טבלת משתנים זיכרון
1 2
my_dogDog
your_dogDog
Rex
; your_dog = my_dog. פעולת ההצבה 8.; j = iעושה משהו אחר לגמרי מאשר
הפניהטפוסמשתנהiint
jint
טבלת משתנים זיכרון
1 2
my_dogDog
your_dogDog
Rex
לא הוקצה זיכרון נוסף ולא הועתקו ערכים
; your_dog.set_name(“Hetz”) על ידי your_dog. נשנה את הערך של 9
הפניהטפוסמשתנהiint
jint
טבלת משתנים זיכרון
1 2
my_dogDog
your_dogDog
לא הוקצה זיכרון נוסף ולא הועתקו ערכיםmy_dog !!!השתנה
Hetz
לסכוםערכי משתנים פשוטים מוצבים ע"י ערך.
ערכי עצמים מוצבים בהפניה.
ומה באשר להצבת משתנים כפרמטרים לפונקציות?אותו דבר
נראו הזיכרון וטבלת המשתנים כך: j = i ו ;i = 7. כזכור, אחרי בצוע הפקודות1
הפניהטפוסמשתנהiint
jint
טבלת משתנים זיכרון
7 7
} public static int change_me(int m)נגדיר פונקציה חדשה m = m – 5; return m ; }
הפניהטפוסמשתנהiint
jint
טבלת משתנים זיכרון
7 7
הקריאה לפונקציה יוצרת טבלת משתנים חדשה, המכסה את הקודמת..mמוקצה מקום בזיכרון עבור המשתנה הפורמאלי
הפניהטפוסמשתנהmint
טבלת משתנים . j = change_me(i). ניקרא לפונקציה על ידי 2
הפניהטפוסמשתנהiint
jint
טבלת משתנים זיכרון
7 7הפניהטפוסמשתנה
mint
טבלת משתנים) m .( מועתק למשתנה הפורמאלי ) i(. הערך של המשתנה האקטואלי 3
7
הפניהטפוסמשתנהiint
jint
טבלת משתנים זיכרון
7 7הפניהטפוסמשתנה
mint
טבלת משתנים. גוף הפונקציה מתבצע4
2
הפניהטפוסמשתנהiint
jint
טבלת משתנים זיכרון
7 2
. בחזרה מהפונקציה :5. מקבל את ערך ההחזרהjא.
ב. הזיכרון שהוקצה לפונקציה מתנקה.ג. טבלת המשתנים של הפונקציה מוסרת.
public class Dog_driver4 { public static void main(String[] args) { Dog canis = new Dog(“Rex”); Dog canis1; canis1 = change_name(canis,”Tushtush”); canis.voice(); canis1.voice();
System.out.println(canis == canis1); } public static Dog change_name(Dog to_change, String new_name) { to_change.set_name(new_name); return to_change; }}
פלט
The dog called Tushtush: HAAUThe dog called Tushtush: HAAUtrue
Dog canis = new Dog(“Rex”);Dog canis1;
הפניהטפוסמשתנהcanisDog
canis1Dog
טבלת משתנים זיכרון
Rex
אחרי
הפניהטפוסמשתנהMy_dogDog
טבלת משתנים זיכרון
בזמן בצוע הפונקציה
Tushtush
טפומשתנהס
הפניה
to_changeDog
טבלת משתנים
הפניהטפוסמשתנהcanisDog
canis1Dog
טבלת משתנים זיכרון
בחזרה מהפונקציה
Tushtush
שתייצג להקת כלבים.Packנגדיר עתה מחלקה .Dogלפני שנכתוב אותה נראה איך צריך לשנות את המחלקה
,null ונאתחל אותו להיות my_packא. נוסיף משתנה עצם פרטי כלומר ברירת המחדל היא שהכלב אינו חבר בלהקה.
; private Pack my_pack = null} ()public Pack get_packב. נוסיף שיטות:
return my_pack;}
public boolean set_pack(Pack pack) { if (my_pack != null) return false;
my_pack = pack; return true;}
public class Pack { static public final int MAX_MEMBERS = 10; private Dog[] members; private int number_of_members; private String name; public Pack(String name) { this.name = name; members = new Dog[MAX_MEMBERS]; number_of_members = 0; } public int size() { return number_of_members; } public String toString() { return "a Pack called "+name; }}
public boolean add_member(Dog candidate) { if (number_of_members >= MAX_MEMBERS) { System.out.println("Pack is full “+ “cannot add "+ candidate); return false; } for (int idog = 0; idog < size();idog++)
if (members[idog] == candidate) { System.out.println(candidate + ” already_in”); return false; } members[number_of_members] = candidate; candidate.set_pack(this); number_of_members++; return true; }}
Public class Dog_driver5 { static void main(String[] args) { Pack pack1 = new Pack(“mountain”); Pack pack2 = new Pack(“field”);
Dog canis = new Dog(“Rex”);Dog canis1 = new Dog(“Tushtush”);pack1.add_member(canis);canis1.set_pack(pack2);System.out.println(canis+” belongs_to “+canis.get_pack()+
“of size “+ canis.get_pack().size()); System.out.println(canis1+” belongs_to “+canis1.get_pack()+ “of size “+ canis1.get_pack().size()); }}
פלט
The dog called Rex belongs_to a Pack called mountain of size 1The dog called Tushtush belongs_to a Pack called field of size 0
public boolean set_pack(Pack pack) {if (my_pack != null) return false;my_pack = pack;pack.add_member(this) ;
return true;}
.Dogשל set_packנשנה את שיטה
public boolean set_pack(Pack pack) { if (my_pack != null) return false; if (! pack.has_place()) if (pack.is_included(this)) { my_pack = pack; return true; } else return false; my_pack = pack; pack.add_member(this); return true; }
אכן צריך לשנות אותה עוד
הן: Packכאשר השיטות החדשות במחלקה
public boolean is_included(Dog dog) { for (int idog = 0; idog < size();idog++) if (members[idog] == dog) { return true; } return false; }
public boolean has_place() { return (size() < MAX_MEMBERS); }
public boolean add_member(Dog candidate) { if (number_of_members >= MAX_MEMBERS) { System.out.println("Pack is full "); return false; } if (is_included(candidate)) return false; if ((candidate.get_pack() == null)|| (candidate.get_pack() == this)) { members[number_of_members] = candidate; number_of_members++; candidate.set_pack(this); return true; } return false; }
שונה ל add_memberו
פלט
The dog called Rex belongs_to a Pack called mountain of size 1The dog called Tushtush belongs_to a Pack called field of size 1