Object中clone()方法是protected的,是浅拷贝,要使用clone方法,要重写它,只有实现了implements Cloneable才可以调用该方法,否则会抛出CloneNotSupportedException异常。
@Override public Object clone(){ Object o = null; try { o = super.clone(); }catch (CloneNotSupportedException e){ e.printStackTrace(); } // Person p = (Person) o; // p.book = (Book)p.getBook().clone(); //放开这两段即为深拷贝的用法 return o; }
在我们需要复制对象的时候常用的三种方式
public static void main(String[] args){
Book b = new Book("java");
Person p = new Person("wt",b);
Person p1 = new Person(p);
Person p2 = (Person) p.clone();
b.setBookName("js");
p.setName("zjj");
System.out.println("P:"+p);
System.out.println("P1:"+p1);
System.out.println("P2:"+p2);
}
当clone使用浅拷贝(即不放开那两段)时,只拷贝对象不包含对对象引用的对象的拷贝:
P:{name:zjj, book:{bookName:js}} P1:{name:wt, book:{bookName:js}} //不论是p1还是p2,基本类型的数值是直接拷贝值的,但是引用类型的对象却是拷贝地址的 P2:{name:wt, book:{bookName:js}} //这样一旦p的原始值引用的对象改变,浅拷贝后的对象也会随之变化
当clone使用深拷贝(即放开那两段)时:
P2:{name:wt, book:{bookName:java}} //深拷贝时,连对象中的对象都进行的是值拷贝,所以原始值的引用对象改变不会影响它
原文:https://www.cnblogs.com/sycamore0802/p/11247877.html