java心得(深克隆和浅克隆)

一.深克隆和浅克隆(以前看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方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值