浅克隆与深克隆简述(如有问题烦请各位同学指正):
浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。
深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。
1:浅克隆
浅克隆只需要实现两个接口:Serializable Cloneable ,然后实现 Cloneable 接口的 clone 方法 就可以实现浅克隆了。代码参考如下:
import java.io.Serializable;
public class User implements Serializable,Cloneable {
private String name;
private Integer age;
public static String JINGTAI = "55555";
public User(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public Object clone() {
Object o = null;
try {
//Object中的clone()识别出你要复制的是哪一个对象
o = (User) super.clone();
} catch (CloneNotSupportedException e) {
System.out.println(e.toString());
}
return o;
}
}
直接调用父类的clone()方法即可实现浅克隆
2:深克隆
深克隆是通过ByteArrayOutputStream,ObjectOutputStream,ByteArrayInputStream,ObjectInputStream这些IIO操作实现的,Java的深克隆其实就是反序列化的一个过程
代码如下:
import java.io.*;
public class Teacher implements Serializable,Cloneable {
private String name;
private int age;
public Teacher(String name, int age){
this.name = name;
this.age = age;
}
public Object deepClone() throws IOException, ClassNotFoundException {
//序列化
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
//反序列化
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
3:测试上面的结论
测试代码
import java.io.IOException;
public class CloneDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
User user = new User("222",20);
User user1 = (User) user.clone();
System.out.println("浅克隆两个对象是否地址相同:"+(user.getName()==user1.getName()));
Teacher teacher = new Teacher("222",20);
Teacher teacher1 = (Teacher) teacher.deepClone();
System.out.println("深克隆两个对象是否地址相同:"+(teacher.getName()==teacher1.getName()));
}
}
输入结果如下: