浅克隆
对象的浅克隆就是在克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候只是克隆另外一个对象的地址,而没有把另外一个对象也克隆了一份。
深克隆
对象的深克隆就是在克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候把另外一个对象也克隆了一份。
实现浅克隆的要点
- 在Java中clone()的权限修饰符是受保护的,在使用时,需要子类重写该方法(重写逻辑还是用父类clone逻辑),并把把该方法的权限修饰符改成public。
- 如果一个对象要调用clone的方法克隆,那么该对象所属的类必须要实现Cloneable接口。
- Cloneable接口只是一个标识接口,里面没有任何方法。
- 对象的浅克隆就是在克隆一个对象的时候,如果被克隆的对象里面维护了另外一个类的对象,这时候只是克隆里另外一个对象的地址,而没有把另外一个对象也克隆了一份。
- 对象的浅克隆不会调用到构造方法的。
package org.baidu2;
public class Mytest {
public static void main(String[] args) throws CloneNotSupportedException {
Dogfood dogfood = new Dogfood("一号狗粮");
Dog dog = new Dog("大黄", 12, dogfood);
dog.dogfood.name="二号狗粮";
Dog clone = (Dog) dog.clone();
clone.dogfood .name="三号狗粮";
System.out.println(dog.dogfood.name);
System.out.println(clone.dogfood.name);
}
}
class Dog implements Cloneable{
public String name;
public int age;
public Dogfood dogfood;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public Dog(String name, int age, Dogfood dogfood) {
this.name = name;
this.age = age;
this.dogfood = dogfood;
}
}
class Dogfood{
public String name;
public Dogfood(String name) {
this.name = name;
}
}
运行结果
三号狗粮
三号狗粮
深克隆
对象的深克隆采用IO流来实现,使用ObjectOutputStream将对象写入文件中,再用ObjectIntputStream读取回来。