一. 浅复制
当一个类需要有拷贝的功能,需实现Cloneable接口,但该接口缺少一个clone方法,其主要功能是为类提供一个功能合适的公共clone()方法,使用时需重写Object类的clone()方法。
通过这种方法实现的复制为浅复制,即复制得到的对象与原对象指向同一个内存地址,修改其中一个对象的属性,其他对象会随之发生改变。
例如:
public class Student implements Cloneable {
private int age;
private Teacher teacher;
public Student(int age, Teacher teacher) {
this.age = age;
this.teacher = teacher;
}
public Student() {
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", teacher=" + teacher +
'}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
Object object = super.clone();
return object;
}
}
测试类:
public class Demo {
public static void main(String[] args) throws CloneNotSupportedException {
Teacher teacher = new Teacher("刘亦菲");
Student stu1 = new Student(18,teacher);
Student stu2 = (Student) stu1.clone();
System.out.println(stu1);
System.out.println(stu2);
}
}
二. 深复制
深复制会赋值所有的属性,并复制属性指向的动态分配的内存。从而让返回的对象不依赖于被复制的对象。
1. 构造器深复制
@Override
protected Object clone() throws CloneNotSupportedException {
Teacher teacher = new Teacher(this.teacher.getName());
Student student = new Student(this.age, teacher);
return student;
}
此时clone()方法相当于一个构造器,调用时生成一个全新的对象并将原对象的属性赋值给新对象。
2. 序列化复制
序列化: 就是把一个对象的状态全部用字节码保存起来 存到硬盘 数据库等等…
反序列化:就是序列化的逆过程 把你存起来的字节码恢复成对象 其底层依赖反射
在Teacher 类 和Student类中实现Serializable接口
并尝试着把Student对象写到文件里
在Student里实现一个方法
public void write() throws IOException {
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("D://12345.txt"));
objectOutputStream.writeObject(this);
}
再同样的方法读出
public static Object read() throws IOException, ClassNotFoundException {
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("D://12345.txt"));
return objectInputStream.readObject();
}
即可获得两个不同的对象。