Complete the Primitive types vs references exercises with calls before reviewing the solutions.
Review the primitive exercise solution with AP CS Tutor Brandon Horn.
Original code
public static void main(String[] args)
{
Coordinate2D e = new Coordinate2D(1,1);
reference2(e);
System.out.println(e);
}
private static void reference2(Coordinate2D f)
{
f = new Coordinate2D(2,2);
}
Output
(1, 1)
Explanation
All arguments in Java are passed by value, including references. The call reference2(e);
passes a copy of the value of e
to the reference2
method. The value of e
is the memory address of the object containing x: 1, y: 1
.
The reference2
method changes the actual value of f
, which has no effect on the value of e
.
Step by step with memory diagrams
Step 1
public static void main(String[] args)
{
Coordinate2D e = new Coordinate2D(1,1);
// more code not yet run
}
Memory diagram after Step 1
Except for the variable name, this is the same as Reference exercise 1 with call Step 1.
Step 2
public static void main(String[] args)
{
Coordinate2D e = new Coordinate2D(1,1);
reference2(e);
// more code not yet run
}
private static void reference2(Coordinate2D f)
{
// more code not yet run
}
Step 2 is immediately after the call to the reference2
method, but before any code inside the reference2
method has been run.
Memory diagram after Step 2
Except for the variable names, this is the same as Reference exercise 1 with call Step 2.
Step 3
public static void main(String[] args)
{
Coordinate2D e = new Coordinate2D(1,1);
reference2(e);
// more code not yet run
}
private static void reference2(Coordinate2D f)
{
f = new Coordinate2D(2,2);
}
Step 3 is immediately after execution of the statement f = new Coordinate2D(2,2);
, but before the reference2
method returns.
Memory diagram after Step 3
The statement f = new Coordinate2D(2,2);
creates a new object and points f
at it (sets the value of f
to the memory address of the object). Changing the actual value of f
does not change the value of e
. All arguments in Java are passed by value.
Contrast this with the reference1
method in Reference exercise 1 with call. The reference1
method runs a mutator method on the object to which both c
and d
point.
Step 4
public static void main(String[] args)
{
Coordinate2D e = new Coordinate2D(1,1);
reference2(e);
System.out.println(e);
}
private static void reference2(Coordinate2D f)
{
f = new Coordinate2D(2,2);
}
Step 4 is after the reference2
method returns and after the print
statement executes.
Memory diagram after Step 4
When the reference2
method ends, f
no longer exists. In Java, when the last reference to an object is removed, the object is considered garbage and can no longer be accessed.
Output after Step 4
(1, 1)
The main
method prints e
, which runs the toString
method on the object to which e
refers.