黑马程序员技术交流社区

标题: 学习笔记-接口,内部类,对象克隆(完结) [打印本页]

作者: 李云贵    时间: 2014-7-20 08:14
标题: 学习笔记-接口,内部类,对象克隆(完结)
对象克隆
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();


作者: Adjin    时间: 2014-7-20 08:42
嗯,为啥我看的objcet类就讲了equlas,tostring hashcode这三个方法,没有将克隆




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2