28
Lec 23 Memory Maps Primitive variables and Reference (object) variables

Lec 23 Memory Maps Primitive variables and Reference (object) variables

Embed Size (px)

Citation preview

Page 1: Lec 23 Memory Maps Primitive variables and Reference (object) variables

Lec 23 Memory MapsPrimitive variables and

Reference (object) variables

Page 2: Lec 23 Memory Maps Primitive variables and Reference (object) variables

Reminder

• Primitive variables – of type int, double, char, boolean– the variable contains the data

• Object variables– of type String, Point, Pad, Dairy, int [] (i.e. array)– refer to an object (or contain null)– actual data (the object) is elsewhere in memory

Page 3: Lec 23 Memory Maps Primitive variables and Reference (object) variables

A primitive/object example      int i = 2;        int j = i;        i = 3;        System.out.println(i);        System.out.println(j);

        Point p = new Point(2,2);        Point q = p;        p.setLocation(3,3);        System.out.println(p);        System.out.println(q);

Expected Output??: 3 2 java.awt.Point[x=3,y=3] java.awt.Point[x=2,y=2] java.awt.Point[x=3,y=3]

Page 4: Lec 23 Memory Maps Primitive variables and Reference (object) variables

A primitive/object example      int i = 2;         int j = i;        i = 3;        System.out.println(i);        System.out.println(j);

        Point p = new Point(2,2);        Point q = p;        p.setLocation(3,3);        System.out.println(p);        System.out.println(q);

2i

Page 5: Lec 23 Memory Maps Primitive variables and Reference (object) variables

A primitive/object example      int i = 2;         int j = i;         i = 3;        System.out.println(i);        System.out.println(j);

        Point p = new Point(2,2);        Point q = p;        p.setLocation(3,3);        System.out.println(p);        System.out.println(q);

2i

2j

Page 6: Lec 23 Memory Maps Primitive variables and Reference (object) variables

A primitive/object example      int i = 2;         int j = i;        i = 3;         System.out.println(i);        System.out.println(j);

        Point p = new Point(2,2);        Point q = p;        p.setLocation(3,3);        System.out.println(p);        System.out.println(q);

3i

2j

Page 7: Lec 23 Memory Maps Primitive variables and Reference (object) variables

A primitive/object example      int i = 2;         int j = i;        i = 3;        System.out.println(i); print 3        System.out.println(j);

        Point p = new Point(2,2);        Point q = p;        p.setLocation(3,3);        System.out.println(p);        System.out.println(q);

3i

2j

Page 8: Lec 23 Memory Maps Primitive variables and Reference (object) variables

A primitive/object example      int i = 2;         int j = i;        i = 3;        System.out.println(i);        System.out.println(j); print 2

        Point p = new Point(2,2);        Point q = p;        p.setLocation(3,3);        System.out.println(p);        System.out.println(q);

3i

2j

Page 9: Lec 23 Memory Maps Primitive variables and Reference (object) variables

A primitive/object example      int i = 2;         int j = i;        i = 3;        System.out.println(i);        System.out.println(j);

        Point p = new Point(2,2);        Point q = p;        p.setLocation(3,3);        System.out.println(p);        System.out.println(q);

3i

2j

p

point x y

2

2

Page 10: Lec 23 Memory Maps Primitive variables and Reference (object) variables

A primitive/object example      int i = 2;         int j = i;        i = 3;        System.out.println(i);        System.out.println(j);

        Point p = new Point(2,2);        Point q = p;         p.setLocation(3,3);        System.out.println(p);        System.out.println(q);

3i

2j

p

q

point x y

2

2

Page 11: Lec 23 Memory Maps Primitive variables and Reference (object) variables

A primitive/object example      int i = 2;         int j = i;        i = 3;        System.out.println(i);        System.out.println(j);

        Point p = new Point(2,2);        Point q = p;        p.setLocation(3,3);         System.out.println(p);        System.out.println(q);

3i

2j

p

q

point x y

3

3

Page 12: Lec 23 Memory Maps Primitive variables and Reference (object) variables

A primitive/object example      int i = 2;         int j = i;        i = 3;        System.out.println(i);        System.out.println(j);

        Point p = new Point(2,2);        Point q = p;        p.setLocation(3,3);        System.out.println(p); print 3,3        System.out.println(q);

3i

2j

p

q

point x y

3

3

Page 13: Lec 23 Memory Maps Primitive variables and Reference (object) variables

A primitive/object example      int i = 2;         int j = i;        i = 3;        System.out.println(i);        System.out.println(j);

        Point p = new Point(2,2);        Point q = p;        p.setLocation(3,3);        System.out.println(p);         System.out.println(q); print 3,3

3i

2j

p

q

point x y

3

3

Page 14: Lec 23 Memory Maps Primitive variables and Reference (object) variables

Why is this?

• This exemplifies a key difference between primitive variables and reference (i.e. object) variables: For primitives types, we have primitive variables, which actually store a value – Assignment statements for primitive variables actually

copy the value over • For class types, we have reference variables, which

only store a reference to an object – Assignment statements for reference variables only copy

a pointer over

Page 15: Lec 23 Memory Maps Primitive variables and Reference (object) variables

Memory diagrams

• Memory diagrams are a very useful tool for understanding what's going on inside memory

• We will use the following conventions: – Represent a variable with an oval containing its type

(optional), name, and contents (which goes inside a box within the oval)

• For primitive variables, put the value right in the box • For reference (class type) variables, draw an arrow from that box

to the actual object which is elsewhere on the diagram

– Represent objects as boxes; the type goes on top and is underlined, any variables within the object are listed inside the box (the ovals can be omitted in this case)

Page 16: Lec 23 Memory Maps Primitive variables and Reference (object) variables

Memory Map -- Assignment

• When an assignment statement happens: – If the receiving variable is a primitive type, just

copy the value into its box – If the receiving variable is a class type, make its

arrow point to whatever object it is getting assigned to

– In other words, always copy what's in the box - it will be either a pointer or a primitive value!

Page 17: Lec 23 Memory Maps Primitive variables and Reference (object) variables

More practice on primitive versus reference variables

• Challenge: How could we make it so that we actually make a true copy of the Point in the last example? – One way is to make a new Point and then copy the desired x

and y coordinates into it – Another way is to make a new Point using the desired x and y

coordinates directly – This example makes a true copy of a Point and does some

pointer manipulation. • Here is a sequence of memory diagrams for that code

• When an object no longer has references to it, you can no longer get to it and it eventually gets erased by the garbage collector; this frees up the memory it was using

Page 18: Lec 23 Memory Maps Primitive variables and Reference (object) variables

               Point p = new Point(2,2);                Point q = new Point();        q.setLocation(p);

                p.setLocation(3,3);        System.out.println(p); //prints a point at (3,3)        System.out.println(q); //prints a point at (2,2)                p = q; //Makes p point to q's object; this is NOT a true copy        System.out.println(p); //prints a point at (2,2)        System.out.println(q); //prints a point at (2,2)

How to make a true copy of a Point

p

point x y

2

2

Page 19: Lec 23 Memory Maps Primitive variables and Reference (object) variables

How to make a true copy of a Point

               Point p = new Point(2,2);                Point q = new Point();        q.setLocation(p);

                p.setLocation(3,3);        System.out.println(p); //prints a point at (3,3)        System.out.println(q); //prints a point at (2,2)                p = q; //Makes p point to q's object; this is NOT a true copy        System.out.println(p); //prints a point at (2,2)        System.out.println(q); //prints a point at (2,2)

p

q

point x y

2

2

point x y

0

0

Page 20: Lec 23 Memory Maps Primitive variables and Reference (object) variables

How to make a true copy of a Point

               Point p = new Point(2,2);                Point q = new Point();        q.setLocation(p);

                p.setLocation(3,3);        System.out.println(p); //prints a point at (3,3)        System.out.println(q); //prints a point at (2,2)                p = q; //Makes p point to q's object; this is NOT a true copy        System.out.println(p); //prints a point at (2,2)        System.out.println(q); //prints a point at (2,2)

p

q

point x y

2

2

point x y

2

2

Page 21: Lec 23 Memory Maps Primitive variables and Reference (object) variables

How to make a true copy of a Point

               Point p = new Point(2,2);                Point q = new Point();        q.setLocation(p);

                p.setLocation(3,3);        System.out.println(p); //prints a point at (3,3)        System.out.println(q); //prints a point at (2,2)                p = q; //Makes p point to q's object; this is NOT a true copy        System.out.println(p); //prints a point at (2,2)        System.out.println(q); //prints a point at (2,2)

p

q

point x y

3

3

point x y

2

2

Page 22: Lec 23 Memory Maps Primitive variables and Reference (object) variables

How to make a true copy of a Point

               Point p = new Point(2,2);                Point q = new Point();        q.setLocation(p);

                p.setLocation(3,3);        System.out.println(p); //prints a point at (3,3)         System.out.println(q); //prints a point at (2,2)                p = q; //Makes p point to q's object; this is NOT a true copy        System.out.println(p); //prints a point at (2,2)        System.out.println(q); //prints a point at (2,2)

p

q

point x y

3

3

point x y

2

2

Page 23: Lec 23 Memory Maps Primitive variables and Reference (object) variables

How to make a true copy of a Point

               Point p = new Point(2,2);                Point q = new Point();        q.setLocation(p);

                p.setLocation(3,3);        System.out.println(p); //prints a point at (3,3)         System.out.println(q); //prints a point at (2,2)                 p = q; //Makes p point to q's object; this is NOT a true copy        System.out.println(p); //prints a point at (2,2)        System.out.println(q); //prints a point at (2,2)

p

q

point x y

3

3

point x y

2

2

Page 24: Lec 23 Memory Maps Primitive variables and Reference (object) variables

How to make a true copy of a Point

               Point p = new Point(2,2);                Point q = new Point();        q.setLocation(p);

                p.setLocation(3,3);        System.out.println(p); //prints a point at (3,3)        System.out.println(q); //prints a point at (2,2)                 p = q; //Makes p point to q's object; this is NOT a true copy         System.out.println(p); //prints a point at (2,2)        System.out.println(q); //prints a point at (2,2)

p

q

point x y

3

3

point x y

2

2

Page 25: Lec 23 Memory Maps Primitive variables and Reference (object) variables

How to make a true copy of a Point

               Point p = new Point(2,2);                Point q = new Point();        q.setLocation(p);

                p.setLocation(3,3);        System.out.println(p); //prints a point at (3,3)        System.out.println(q); //prints a point at (2,2)                 p = q; //Makes p point to q's object; this is NOT a true copy         System.out.println(p); //prints a point at (2,2)         System.out.println(q); //prints a point at (2,2)

p

q

point x y

3

3

point x y

2

2

Page 26: Lec 23 Memory Maps Primitive variables and Reference (object) variables

How to make a true copy of a Point

               Point p = new Point(2,2);                Point q = new Point();        q.setLocation(p);

                p.setLocation(3,3);        System.out.println(p); //prints a point at (3,3)        System.out.println(q); //prints a point at (2,2)                 p = q; //Makes p point to q's object; this is NOT a true copy         System.out.println(p); //prints a point at (2,2)         System.out.println(q); //prints a point at (2,2)

p

q point

x y

2

2

Page 27: Lec 23 Memory Maps Primitive variables and Reference (object) variables

Some technical jargon for methods:

• Mutator methods: methods that change the state of the object – For the Particle class: passTime and reset are mutator methods

• Accessor methods: methods that return info about the state of the object – For the Particle class: getXPosition, getYPosition, getXVelocity, and getYVelocity

are accessor methods

• Predicate methods: methods that return a boolean (true/false value) – For the Particle class: isFalling is a predicate method

• Invoking a method with dot syntax is called calling a method or sending a message to that object

• When calling a method, the values given between the parentheses are called arguments

• If you get something back as a result of calling a method, it is called a return value

Page 28: Lec 23 Memory Maps Primitive variables and Reference (object) variables

Edit-complile-test cycle

• You may have noticed that when programming, we usually: – 1) Edit the source code a little bit – 2) Compile to make sure we have the syntax right (automatic in

Eclipse) – 3) Test our program to see if it behaves the way we expected so

far – 4) Go back to 1) until we are done writing the program

• This process is known as the edit-compile-test cycle • It is often better to make small changes and check your

work so you can spot and correct errors quickly and before they become confounding