package method; import java.util.Date; import java.util.Vector; /* * 小心使用克隆 */ public class CareUpdateClone implements Cloneable { //String等java定义的类型就不需要再深入clone了,这些属于没必要进行clone的情况。但List类型等“容器”类是有必要clone的成员类型。 public static void main(String[] args) { CareUpdateClone careUpdateClone = new CareUpdateClone("java",15); //克隆对象 CareUpdateClone copy = (CareUpdateClone) careUpdateClone.clone(); copy.printlnLovers(); //克隆前,是同一个地址 System.out.println("copy.name==careUpdateClone.name :"+copy.name == careUpdateClone.name); //更改名字 copy.name = ".net"; System.out.println(copy.name+","+careUpdateClone.name); careUpdateClone.printlnLovers(); System.out.println("更改copy lover爱好: 篮球-->游泳"); copy.lovers[0] = "游泳";//我们发现直接super.clone();(所以我们需要在clone代码处,对爱好数组作深度拷贝) //只是复制的地址,同一个引用,所以得深度复制 System.out.println("careUpdateClone lovers:"); careUpdateClone.printlnLovers(); } private String name;//简单类型 private int age;//简单类型 private String[] lovers = new String[]{"篮球","上网","看电视","看书"};//复杂类型 private Vector<B> list = new Vector<B>(); //更为复杂类型Hash public CareUpdateClone(String name,int age) { this.name = name; this.age = age; System.out.println("构造方法有调用2次吗?没有的话"); } @Override protected Object clone() { // TODO Auto-generated method stub try { CareUpdateClone care= (CareUpdateClone) super.clone(); //对数组进行进行深度克隆 care.lovers = care.lovers.clone();//如果不这样克隆,那么两个对象会指向同一个数组, //对集合类,进行深度拷贝 Vector<B> list2 = new Vector<B>(); for(int i=0;i<care.list.size();i++){ //骤一拷贝 list2.add((B)care.list.get(i).clone()); } return care; } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } @Override public String toString() { return "name: "+this.name+"/tage: "+this.age; } public void printlnLovers(){ System.out.println("爱好列表:"); for(String lover : lovers){ System.out.println(lover); } } } class B implements Cloneable{ @Override public String toString() { return "Class B"; } @Override protected Object clone() throws CloneNotSupportedException { // TODO Auto-generated method stub return super.clone(); } }