class Integer {
     Integer(int val) {this.val = val;}
     Integer(Integer integer) {val = integer.val;}     // copy constructor
     void copy(Integer integer) {val = integer.val;}   // in-place copy method
	public String toString() {return val+"";}

     int val;

	static Integer i1, i2, i3, i4; 

	public static void main(String [] args) {
		System.out.println("calling 'int' constructor for i1");
		i1 = new Integer(3);       // uses 'int' constructor
		print();

		System.out.println("calling 'int' constructor for i2");
		i2 = new Integer(12);      // uses 'int' constructor
		print();

		System.out.println("calling copy constructor for i3");
		i3 = new Integer(i1);      // uses copy constructor
		print();

		System.out.println("'reference' assignment to i4");
		i4 = i1;                   // reference assignment &mdash; alias
		print();

		System.out.println("calling in-place copy for i4");
		System.out.println("(note the value of i1 after)");
		i4.copy(i2);                       // in-place copy
		print();
	}

	static void print() {
		Integer [] integers = new Integer[5];
		integers[1] = i1;
		integers[2] = i2;
		integers[3] = i3;
		integers[4] = i4;

		for (int i = 1; i < integers.length; i++)
			System.out.print("i" + i + ": " + integers[i] + (i < integers.length-1 ? ", " : ""));
		System.out.println();

		for (int i = 1; i < integers.length; i++)
			for (int j = i+1; j < integers.length; j++)
				if (integers[i] != null && integers[i] == integers[j])
					System.out.println("i" + j + " is an alias of i" + i);
		System.out.println();
	}
	
}

