对象克隆 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();
|