java如何实现对象的深克隆?

如题所述




/**定义用户**/

publicclassUser{

privateStringname;

privateAddressaddress;

//constructors,gettersandsetters

}

/**地址**/

publicclassAddress{

privateStringcity;

privateStringcountry;

//constructors,gettersandsetters

}

重载clone()方法

Object父类有个clone()的拷贝方法,不过它是protected类型的,

我们需要重写它并修改为public类型。

除此之外,子类还需要实现Cloneable接口来告诉JVM这个类是可以拷贝的。

重写代码

让我们修改一下User类,Address类,实现Cloneable接口,使其支持深拷贝。

/**

*地址

*/

publicclassAddressimplementsCloneable{

privateStringcity;

privateStringcountry;

//constructors,gettersandsetters

@Override

publicAddressclone()throwsCloneNotSupportedException{

return(Address)super.clone();

}

}

/**

*用户

*/

publicclassUserimplementsCloneable{

privateStringname;

privateAddressaddress;

//constructors,gettersandsetters

@Override

publicUserclone()throwsCloneNotSupportedException{

Useruser=(User)super.clone();

user.setAddress(this.address.clone());

returnuser;

}

}

需要注意的是,super.clone()其实是浅拷贝,

所以在重写User类的clone()方法时,address对象需要调用address.clone()重新赋值。



扩展:

为什么要克隆?

大家先思考一个问题,为什么需要克隆对象?直接new一个对象不行吗?

答案是:克隆的对象可能包含一些已经修改过的属性,而new出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠clone方法了。那么我把这个对象的临时属性一个一个的赋值给我新new的对象不也行嘛?可以是可以,但是一来麻烦不说,二来,大家通过上面的源码都发现了clone是一个native方法,就是快啊,在底层实现的。

提个醒,我们常见的Objecta=newObject();Objectb;b=a;这种形式的代码复制的是引用,即对象在内存中的地址,a和b对象仍然指向了同一个对象。

而通过clone方法赋值的对象跟原来的对象时同时独立存在的。


温馨提示:答案为网友推荐,仅供参考
相似回答