public class ShallowDeep {
	public static void main(String[] args) {
		Incrementor inc = new Incrementor(); // make a new object
		//Incrementor foo = new Incrementor(5); // generates compiler error
		System.out.println("initial inc.getValue() = " + inc.getValue());

		System.out.println();

		Incrementor alias = inc; // make an alias to the inc object
		alias.increment(); // change the object
		System.out.println("After calling alias.increment():");
		System.out.println("inc.getValue() = " + inc.getValue());
		System.out.println("alias.getValue() = " + alias.getValue());

		System.out.println();

		Incrementor clone = (Incrementor)inc.clone(); // make a clone of the inc object
		clone.increment(); // change the object
		System.out.println("After calling clone.increment():");
		System.out.println("inc.getValue() = " + inc.getValue());
		System.out.println("clone.getValue() = " + clone.getValue());
	}
}


class Incrementor implements Cloneable {
	// public constructor, initilizes  to zero
	public Incrementor() { val = 0; }
	// private constructor, starts at indicated value
	private Incrementor(int val) { this.val = val; }
	// makes deep copies of this object
	public Object clone() { return new Incrementor(val); }

	int getValue() { return val; } // accessor method
	void increment() { val++; } // mutator method
	int val=0; // property
}


/* Output:

initial inc.getValue() = 0

After calling alias.increment():
inc.getValue() = 1
alias.getValue() = 1

After calling clone.increment():
inc.getValue() = 1
clone.getValue() = 2

*/
