一.深克隆和浅克隆(以前看C++的深拷贝和浅拷贝有点蒙,学到Java克隆感觉豁然开朗)
1.浅克隆:浅克隆就是对仅仅复制原来对象的属性值,但是没有克隆原来对象引用属性对象;
2.深克隆:深克隆就是对原来对象完全复制,包括原来对象的引用属性对象也克隆一份
public class Person implements Cloneable{
private String id;//身份证号码
private String name;
private int age;
private double money;//基本数据类型
private Pet pet;//引用数据类型
public Person() {
super();
}
public Person(String id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
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;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Pet getPet() {
return pet;
}
public void setPet(Pet pet) {
this.pet = pet;
}
//右击->source->Generate toString
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + ", money=" + money + ", pet=" + pet + "]";
}
· public Object clone() throws CloneNotSupportedException {
//浅克隆就是没有1和2 方法,这样克隆出来的人的确是两个对象,但是猫却还是一个对象,因为浅克隆只是单纯复制人类其中猫的引用属性,也就是地址,所以
两个猫的对象地址相同,就是同一直猫,所以不符合克隆的逻辑,所以需要克隆新人这个类和克隆新猫这个类,然后用新人拥有新猫
Person o = (Person) super.clone();//o:新的人1
Pet oPet = (Pet) this.pet.clone();//oPet:新的宠物2
o.setPet(oPet);
return o;
}
public class Pet implements Cloneable{
private String name;
private int age;
public Pet() {
}
public Pet(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
import java.util.StringTokenizer;
public class TestClone {
public static void main(String[] args) throws CloneNotSupportedException {
//克隆之后需要得到两个对象,只是对象里面的属性值都一样
Person p = new Person("123456789", "4元", 24);
//设置宠物
Pet pet = new Pet("VIP Dog", 2);
p.setPet(pet);
Object o = p.clone();
System.out.println(p==o);
System.out.println("p.hashCode:"+Integer.toHexString(p.hashCode()));
System.out.println("o.hashCode:"+Integer.toHexString(o.hashCode()));
System.out.println("----------------------");
System.out.println("p:"+p);
System.out.println("o:"+o);
}
}
心得;如果一个类只是包含基本数据类型属性那浅克隆就可以解决,但是如果一个类里面还包含令一个引用属性,那就需要深克隆去进一步克隆这个引用属性对象
步骤,1.派生类一定要实现克隆接口,这个接口没有抽象方法,只是单纯标志接口
2.然后派生类调用supe.clone方法