Manipulate properties after clone operation
public class Main { public static void main(String[] args) { try { Employee e = new Employee("B", 1000); System.out.println(e); System.out.println("The employee's name is " + e.getName()); System.out.println("The employees's pay is " + e.getSalary()); Employee eClone = (Employee) e.clone(); System.out.println(eClone); System.out.println("The clone's name is " + eClone.getName()); System.out.println("The clones's pay is " + eClone.getSalary()); eClone.setName("A"); eClone.setSalary(2000); System.out.println("The employee's name is " + e.getName()); System.out.println("The employees's pay is " + e.getSalary()); System.out.println("The clone's name is " + eClone.getName()); System.out.println("The clones's pay is " + eClone.getSalary()); } catch (Exception e) { System.out.println("Exception " + e); } } } class Employee implements Cloneable { private StringBuffer name; private int salary; public Employee(String name, int salary) { this.name = new StringBuffer(name); this.salary = salary; } public Employee() { } public Object clone() throws CloneNotSupportedException { try { Employee o = (Employee) super.clone(); o.name = new StringBuffer(name.toString()); return o; } catch (CloneNotSupportedException cnse) { System.out.println("CloneNotSupportedException thrown " + cnse); throw new CloneNotSupportedException(); } } public String getName() { return name.toString(); } public void setName(String name) { this.name.delete(0, this.name.length()); this.name.append(name); } public void setSalary(int salary) { this.salary = salary; } public int getSalary() { return this.salary; } }