enum CatColor { BLACK, GREY, ORANGE, CALICO, TORTOISESHELL } class Cat { String name; CatColor color; double clawSharpness; // in range [0.0, 1.0], with 1.0 being razor-sharp. public static void main(String... __) { tryMutatePrimitiveVars(); tryMutateObjectVars(); } static void tryMutatePrimitiveVars() { int n = 32; System.out.println( "n before: " + n ); tripleArg(n); System.out.println( "n after: " + n ); System.out.println( "We note that other methods CANNOT change our local var `n`." ); System.out.println( "" ); } static int tripleArg( int k ) { System.out.println( " tripleArg: k=" + k ); k = 3*k; System.out.println( " tripleArg: k=" + k ); return k; } static void tryMutateObjectVars() { Cat meowser = new Cat( "Mr Purrscratch", CatColor.ORANGE, 0.8 ); System.out.println("meowser holds " + meowser.toString() + " which prints as " + meowser.myToString() ); System.out.println("Uh-oh, painting the cat black:"); meowser.setColor(CatColor.BLACK); System.out.println("meowser holds " + meowser.toString() + " which prints as " + meowser.myToString() ); System.out.println( "Other methods CANNOT change my local var `meowser`, but CAN change the memory that meowser points to." ); System.out.println("\nNow calling assignToArg:"); assignToArg(meowser); System.out.println("meowser holds " + meowser.toString() + " which prints as " + meowser.myToString() ); System.out.println( "Other methods CANNOT change my local var `meowser`." ); } static void assignToArg( Cat some_kat ) { System.out.println( " assignToArg: some_kat=" + some_kat.toString() + ", which prints as " + some_kat.myToString() ); some_kat = new Cat( "Kat", CatColor.TORTOISESHELL, 0.4 ); System.out.println( " assignToArg: some_kat=" + some_kat.toString() + ", which prints as " + some_kat.myToString() ); } void setColor( /* Cat this, */ CatColor _color ) { this.color = _color; } public String myToString( /* Cat this */ ) { return "new Cat( " + "\"" + this.name + "\", " + this.color + ", " + this.clawSharpness + " " + ")"; } public Cat( String _name, CatColor _color, double _clawSharpness ) { this.name = _name; this.color = _color; this.clawSharpness = _clawSharpness; } }