何谓深浅?程度而已。
克隆:复制一份
被克隆的类实现cloneable接口,覆盖clone()方法,返回调用父类的clone()即可。
public class person implements cloneable{ @override protected object clone() throws clonenotsupportedexception { return super.clone(); } //...省略其余代码}
然后,克隆时只须调用我们刚刚覆盖的clone()。
浅拷贝
现在有child类:
public class child{ //...省略其余代码}
还有person类:
public class person implements cloneable{ private int age; private string name; private child child; //...省略其余代码}
克隆person对象p1赋给p2,然后我们看看他们的tostring()和hashcode()结果:
public class main { public static void main(string[] args) throws clonenotsupportedexception { person p1 = new person(zhangsan,23); p1.setchild(new child(xiaoming, 1);); //克隆操作 person p2 = p1.clone(); //打印看看 system.out.println(p1+, +p1.hashcode()+, +p1.getchild().hashcode()); system.out.println(p2+, +p2.hashcode()+, +p2.getchild().hashcode()); }}
输出:
person [age=23, name=zhangsan, value=666, child=child [name=xiaoming, age=1]], 118352462, 1550089733person [age=23, name=zhangsan, value=666, child=child [name=xiaoming, age=2]], 865113938, 1550089733
结论:p1,p2成员的值相等,但它们是两个不同的对象,他们的child成员是同一个对象。
深拷贝
给child也实现cloneable接口并覆盖clone():
public class child implements cloneable{ @override protected object clone() throws clonenotsupportedexception { return super.clone();; } //...省略其余代码}
然后,改变person类的clone()的实现:
public class person implements cloneable{ @override protected object clone() throws clonenotsupportedexception { person p = (person)super.clone(); p.setchild((child)child.clone()); return p; } //...省略其余代码}
然后再调用上面的main(string [] args),结果是:
person [age=23, name=zhangsan, value=666, child=child [name=xiaoming, age=1]], 118352462, 1550089733person [age=23, name=zhangsan, value=666, child=child [name=xiaoming, age=2]], 865113938, 1442407170
结论:p1,p2是两个不同的对象,他们的child成员也是两个不同的对象。
总结
克隆就是复制一份。
浅拷贝就是简单复制值,如果有引用成员,他们的引用成员将是同一个对象,深拷贝则不为然。
为什么呢
可以这样认为,调用谁的clone()就是就是对谁深拷贝。
在上面浅拷贝的例子中,因为调用了p1对象的clone(),所以p1和p2是两个不同的对象(对p1,p2本身深拷贝);在深拷贝的例子中,不但调用了p1的clone(),也调用child类型对象的clone(),所以两个child类型对象不同(对所有对象深拷贝)。
以上就是java克隆的浅析(代码示例)的详细内容。
