您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

Java克隆的浅析(代码示例)

2024/10/26 1:18:13发布42次查看
本篇文章给大家带来的内容是关于java克隆的浅析(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
何谓深浅?程度而已。
克隆:复制一份
被克隆的类实现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克隆的浅析(代码示例)的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product