/** Demo difference between primitive and object type. Arguments are passed by value. A variable assigned an object actually contains a _reference_ (think memory address) of the object. */ public class PrimitiveVsObject { /** Set value of a die, the caller can observe the change. */ private static void setDieValue(Die d) { System.out.println(d + " d.value = " + d.getValue()); d.setValue(2); System.out.println(d + " d.value = " + d.getValue()); } /** Reassign a new die, the caller doesn't know what happened. */ private static Die reassignDie(Die d) { System.out.println(d + " d.value = " + d.getValue()); d = new Die(120); // 120-sided die System.out.println(d + " d.value = " + d.getValue()); d.setValue(3); // changing local d, reassigned. System.out.println(d + " d.value = " + d.getValue()); return d; } /** No way for a caller to see a change of a primitive. */ private static void changeInt(int i) { System.out.println("i = " + i); i++; System.out.println("i = " + i); } public static void main(String[] args) { Die die1 = new Die(6); // 6-sided die die1.setValue(1); System.out.println("before: " + die1 + " die1.value = " + die1.getValue()); System.out.println(); setDieValue(die1); System.out.println("after: " + die1 + " die1.value = " + die1.getValue()); System.out.println(); Die die2 = reassignDie(die1); System.out.println("again: " + die1 + " die1.value = " + die1.getValue()); System.out.println("again: " + die2 + " die2.value = " + die2.getValue()); System.out.println(); int primitiveNumber = 23; System.out.println("primitiveNumber = " + primitiveNumber); changeInt(primitiveNumber); System.out.println("primitiveNumber = " + primitiveNumber); } }