Complete the Arrays as objects exercises before reviewing the solutions.
Review the Arrays as objects exercise 3 solution with AP CS Tutor Brandon Horn.
Original code
public static void main(String[] args)
{
Coordinate2D[] coors = new Coordinate2D[3];
coors[0] = new Coordinate2D(1, 1);
coors[1] = new Coordinate2D(2, 2);
coors[2] = new Coordinate2D(3, 3);
System.out.println(Arrays.toString(coors));
// prints: [(1, 1), (2, 2), (3, 3)]
mystery3(coors);
System.out.println(Arrays.toString(coors));
}
public static void mystery3(Coordinate2D[] coorsInside)
{
coorsInside[0] = new Coordinate2D(4, 4);
}
Output
[(1, 1), (2, 2), (3, 3)]
[(4, 4), (2, 2), (3, 3)]
Explanation
The mechanics are identical to those in Exercise 1.
The call to mystery3
passes the memory address of the array. Within mystery3
, coors
and coorsInside
point to the same array.
Step by step memory diagram
Step 1
public static void main(String[] args)
{
Coordinate2D[] coors = new Coordinate2D[3];
coors[0] = new Coordinate2D(1, 1);
coors[1] = new Coordinate2D(2, 2);
coors[2] = new Coordinate2D(3, 3);
System.out.println(Arrays.toString(coors));
// prints: [(1, 1), (2, 2), (3, 3)]
// additional code not yet run
}
Memory diagram after Step 1
Output after Step 1
[(1, 1), (2, 2), (3, 3)]
Step 2
public static void main(String[] args)
{
Coordinate2D[] coors = new Coordinate2D[3];
coors[0] = new Coordinate2D(1, 1);
coors[1] = new Coordinate2D(2, 2);
coors[2] = new Coordinate2D(3, 3);
System.out.println(Arrays.toString(coors));
// prints: [(1, 1), (2, 2), (3, 3)]
mystery3(coors);
// additional code not yet run
}
public static void mystery3(Coordinate2D[] coorsInside)
{
// additional code not yet run
}
Memory diagram after Step 2
As in Exercise 1, coors
and coorsInside
point to (store the memory address of) the same array.
Output after Step 2
[(1, 1), (2, 2), (3, 3)]
Step 3
public static void main(String[] args)
{
Coordinate2D[] coors = new Coordinate2D[3];
coors[0] = new Coordinate2D(1, 1);
coors[1] = new Coordinate2D(2, 2);
coors[2] = new Coordinate2D(3, 3);
System.out.println(Arrays.toString(coors));
// prints: [(1, 1), (2, 2), (3, 3)]
mystery3(coors);
// additional code not yet run
}
public static void mystery3(Coordinate2D[] coorsInside)
{
coorsInside[0] = new Coordinate2D(4, 4);
}
Memory diagram after Step 3
As in Exercise 1, the actual value inside the array to which both coorsInside
and coors
point is changed.
Output after Step 3
[(1, 1), (2, 2), (3, 3)]
Step 4
public static void main(String[] args)
{
Coordinate2D[] coors = new Coordinate2D[3];
coors[0] = new Coordinate2D(1, 1);
coors[1] = new Coordinate2D(2, 2);
coors[2] = new Coordinate2D(3, 3);
System.out.println(Arrays.toString(coors));
// prints: [(1, 1), (2, 2), (3, 3)]
mystery3(coors);
System.out.println(Arrays.toString(coors));
}
Memory diagram after Step 4
As in Exercise 1, coorsInside
goes away when mystery3
returns. coors
points to the original array; however, the reference at index 0
now points to a Coordinate2D
object containing (4, 4)
.