A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

对象克隆
Object对象有一个方法clone,定义如下
protected Object clone() throws CloneNotSupportedException。
在(没有定义继承父类的)类中可以使用super.clone()来调用它。
其返回一个Object对象,记录着克隆对象的副本。
使用clone方法需要注意以下几点
需要实现Cloneable接口(接口方法全被自动设为为public,所以类中clone方法要定义为public)。
需要对象类型转换才能得到想要的对象类型。
必须在try catch语句块中执行clone方法。
class Human implements Cloneable{
public Object clone(){
Human h=null;
try{
h=(Human)super.clone();
   }catch(CloneNotSupportedException){
    e.PrintStackTrace();}
return h;
}
}
由于clone是Object类提供的方法,Object并不知道类的具体实现细节,只是单纯的把字段拷贝。
这就有一个问题,如果对象中包含另外的对象obIn,拷过去的是对象obIn的引用地址。在任一地方改变对象obIn的值,都是对真实obIn的改变。
解决方法有俩种:
一是在克隆后的副本对象中,让副本对象中的对象obIn指向一个新建的对象,这样就和源对象的obIn不是同一个引用地址了,修改不会影响原本对象。
第二种是在obIn对象中也实现clone方法。
Human类中有Addr类,Addr类中要写跟上例相同的代码
Human类的clone方法中应该在h=(Human)super.clone();后加入一句h.addr=(Adrr)this.addr.clone();

1 个回复

倒序浏览
嗯,为啥我看的objcet类就讲了equlas,tostring hashcode这三个方法,没有将克隆
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马