הגדרת משתנה עצם דומה, אך לא זהה, להגדרת משתנה פשוט. ...

Post on 19-Mar-2016

58 views 0 download

description

הגדרת משתנה עצם דומה, אך לא זהה, להגדרת משתנה פשוט. להבדל יש משמעויות חשובות. כדי להבין אותו נחזור לטבלת המשתנים. נשווה בין הטיפוס הפשוט int לטיפוס העצם מהמחלקה Dog. לשם כך נוסיף למחלקה Dog בונה חדש:. public Dog(String name) { this(name,HAPPY); }. ושיטות חדשות:. - PowerPoint PPT Presentation

transcript

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

כדי להבין אותו נחזור לטבלת המשתנים.

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