Copy
Assignment

//immutable
public class Copy
{
	public static void main(String args[])
	{
		//copy i to j
		int i = 10;
		int j;

		j = i;

		//i and j are pointing to the same address
		System.out.println(System.identityHashCode(i));//2018699554
		System.out.println(System.identityHashCode(j));//2018699554

		//changing value causes that j points to a new address
		j = 100;
		System.out.println(System.identityHashCode(j));//1311053135
	}
}
			

public class Car
{
	private String maker;

	public Car(String m)
	{
		maker = m;
	}

	public void setMaker(String m)
	{
		maker = m;
	}

	public String getMaker(String m)
	{
		return maker;
	}

	public String toString()
	{
		return "Car: "+maker;
	}
}
			
public class Copy
{
	public static void main(String args[])
	{
		Car c1 = new Car("Buick");
		Car c2;

		c2 = c1;

		System.out.println(c1);//Buick
		System.out.println(c2);//Buick

		c2.setMaker("Honda");

		System.out.println(c1);//Honda
		System.out.println(c2);//Honda
	}
}
			
Shallow Copy -- Clone

public class Part
{
	private String name;

	public Part(String n)
	{
		name = n;
	}

	public void setName(String n)
	{
		name = n;
	}

	public String getName()
	{
		return name;
	}

	public String toString()
	{
		return name;
	}
}
			
public class Car implements Cloneable
{
	private String maker;
	private Part part;

	public Car(String m, Part p)
	{
		maker = m;
		part = p;
	}

	public void setMaker(String m)
	{
		maker = m;
	}

	public String getMaker(String m)
	{
		return maker;
	}

	public Part getPart()
	{
		return part;
	}

	public void displayID()
	{
		System.out.println(System.identityHashCode(maker));
		System.out.println(System.identityHashCode(part));
	}

	@Override
	protected Object clone() throws CloneNotSupportedException
	{
		return super.clone();
	}

	public String toString()
	{
		return "Car: "+maker+" "+part;
	}
}
			
public class Copy
{
	public static void main(String args[])
	{
		Part p = new Part("Tire");
		Car c1 = new Car("Buick", p);
		Car c2 = null;

		try{
			c2 = (Car) c1.clone();
		}
		catch (CloneNotSupportedException e)
		{
			e.printStackTrace();
		}

		System.out.println(c1);//Car: Buick Tire
		System.out.println(c2);//Car: Buick Tire

		c1.displayID();//2018699554 1211053135
		c2.displayID();//2018699554 1211053135

		c2.setMaker("Honda");
		//p.setName("Filter");
		c2.getPart().setName("Filter");

		System.out.println(c1);//Buick Filter
		System.out.println(c2);//Honda Filter
		c1.displayID();//2018699554 1211053135
		c2.displayID();//118352462 1311053135
	}
}
			
Deep Copy -- Clone

public class Part implements Cloneable
{
	private String name;

	public Part(String n)
	{
		name = n;
	}

	public void setName(String n)
	{
		name = n;
	}

	public String getName()
	{
		return name;
	}

	@Override
	protected Object clone() throws CloneNotSupportedException
	{
		return super.clone();
	}

	public String toString()
	{
		return name;
	}
}
			
public class Car implements Cloneable
{
	private String maker;
	private Part part;

	public Car(String m, Part p)
	{
		maker = m;
		part = p;
	}

	public void setMaker(String m)
	{
		maker = m;
	}

	public String getMaker(String m)
	{
		return maker;
	}

	public Part getPart()
	{
		return part;
	}

	public void displayID()
	{
		System.out.println(System.identityHashCode(maker));
		System.out.println(System.identityHashCode(part));
	}

	@Override
	protected Object clone() throws CloneNotSupportedException
	{
		Car c = (Car) super.clone();
		c.part = (Part) part.clone();

		return c;
	}

	public String toString()
	{
		return "Car: "+maker+" "+part;
	}
}
			
public class Copy
{
	public static void main(String args[])
	{
		Part p = new Part("Tire");
		Car c1 = new Car("Buick", p);
		Car c2 = null;

		try{
			c2 = (Car) c1.clone();
		}
		catch (CloneNotSupportedException e)
		{
			e.printStackTrace();
		}

		System.out.println(c1);//Car: Buick Tire
		System.out.println(c2);//Car: Buick Tire

		c1.displayID();//2018699554 1311053135
		c2.displayID();//2018699554 118352462

		c2.setMaker("Honda");
		//p.setName("Filter");
		c2.getPart().setName("Filter");

		System.out.println(c1);//Car: Buick Tire
		System.out.println(c2);//Car: Honda Filter
		c1.displayID();//2018699554 1311053135
		c2.displayID();//1550089733 118352462
	}
}
			
Deep Copy -- Copy Constructor
public class Part
{
	private String name;

	public Part(String n)
	{
		name = n;
	}

	public Part(Part p)
	{
		this(p.name);
	}

	public void setName(String n)
	{
		name = n;
	}

	public String getName()
	{
		return name;
	}

	public String toString()
	{
		return name;
	}
}
			
public class Car
{
	private String maker;
	private Part part;

	public Car(String m, Part p)
	{
		maker = m;
		part = p;
	}

	public Car(Car c)
	{
		this(c.maker, new Part(c.part));
	}

	public void setMaker(String m)
	{
		maker = m;
	}

	public String getMaker(String m)
	{
		return maker;
	}

	public Part getPart()
	{
		return part;
	}

	public void displayID()
	{
		System.out.println(System.identityHashCode(maker));
		System.out.println(System.identityHashCode(part));
	}

	public String toString()
	{
		return "Car: "+maker+" "+part;
	}
}
			
public class Copy
{
	public static void main(String args[])
	{
		Part p = new Part("Tire");
		Car c1 = new Car("Buick", p);
		Car c2 = new Car(c1);

		System.out.println(c1);//Car: Buick Tire
		System.out.println(c2);//Car: Buick Tire

		c1.displayID();//2018699554 1311053135
		c2.displayID();//2018699554 118352462

		c2.setMaker("Honda");
		//p.setName("Filter");
		c2.getPart().setName("Filter");

		System.out.println(c1);//Buick Tire
		System.out.println(c2);//Honda Filter
		c1.displayID();//2018699554 1311053135
		c2.displayID();//1550089733 118352462
	}
}
			
Reference