本文共 1766 字,大约阅读时间需要 5 分钟。
Java基础的部分,容易忽略的细节。
浅克隆:对象的属性值进行copy,如果包含引用对象属性,则是引用的传递(如果修改,则其他引用的值也变化)。
深克隆:对对象对属性进行copy,如果包含引用对象属性,则引用对象属性copy。对象不相互影响。
浅拷贝:也是包含引用对象属性,则仅是引用的传递。
深拷贝:所有对象属性互相不影响。
克隆,主要是重写对象的clone方法,然后调用父类的clone();同时clone的对象实现implements Cloneable;
class Student implements Cloneable{
public Object clone() { Object obj=null; //调用Object类的clone方法,返回一个Object实例 try { obj= super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return obj; }
}
深度克隆,则还需要引用属性的对象实现implements Cloneable,clone方法中进行对引用对象clone返回的值赋值
class Student implements Cloneable{
//重写Object类的clone方法 public Object clone() { Object obj=null; //调用Object类的clone方法——浅拷贝 try { obj= super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } //调用Age类的clone方法进行深拷贝 //先将obj转化为学生类实例 Student stu=(Student)obj; //学生类实例的Age对象属性,调用其clone方法进行拷贝 stu.aage=(Age)stu.getaAge().clone(); return obj; }}
浅拷贝:实现方式1.对象的构造函数中进行赋值2.对象的浅克隆
//拷贝构造方法 public Person(Person p) { this.name=p.name; this.age=p.age; }
//通过调用重写后的clone方法进行浅拷贝 Student stu2=(Student)stu1.clone();
深拷贝:实现方式1.深克隆(参看上面的clone方法)2.序列化跟反序列化(对象以及引用属性对象均需要implements Serializable
实现序列化)
//通过调用重写后的clone方法进行浅拷贝 Student stu2=(Student)stu1.clone();
//通过序列化方法实现深拷贝 ByteArrayOutputStream bos=new ByteArrayOutputStream(); ObjectOutputStream oos=new ObjectOutputStream(bos); oos.writeObject(stu1); oos.flush(); ObjectInputStream ois=new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray())); Student stu2=(Student)ois.readObject();
通过序列化的方法可以简洁的实现深度克隆,同时序列返序列化方法如果有错误,在代码编译时就会报错出来。
参考文章:
转载地址:http://mgadi.baihongyu.com/