深拷贝和浅拷贝(clone用法)

我们有的时候在给一个对象赋值另一个对象,要实现的功能是在对后一个对象做修改或其他操作对原有对象没有影响的功能。这种情况我们就要做深拷贝。

现在我写一个实体代码:

public class People implements Cloneable {
	private String name;
	private int 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 Object clone() throws CloneNotSupportedException {
		People p = (People) super.clone();
		return p;
	}
}

然后我用一个测试类来讲解深拷贝和浅拷贝的区别:

浅拷贝:

public class objecttest {
	public static void main(String [] arg){
		People p=new People();
		p.setName("ss");
		p.setAge(22);
		
		People pp=new People();
		pp=p;
		pp.setName("aa");
		pp.setAge(33);

		System.out.println(p.getName());
		System.out.println(pp.getName());
	}
}
看一下运行结果:

这就是浅拷贝:说白了就是在创建一个People对象把它赋值给p,让变量p存储的是创建的People对象的地址。在创建一个People对象将他辅助给pp变量,然后让pp变量存储新创建的People对象的地址,然后在将p变量存储的指向原先创建的People地址赋值给pp。这样就覆盖了后pp的指向,是pp指向了原先创建的地址空间。导致p和pp都是指向的原先创建的People对象的地址。在修改pp对象时我们也将p指向的对象修改了。

深拷贝:

public class objecttest {
	public static void main(String [] arg){

		People p=new People();
		p.setName("ss");
		p.setAge(22);
		People pp=new People();
		try {
			pp=(People) p.clone();
			pp.setName("aa");
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(p.getName());
		System.out.println(pp.getName());
	}
}
运行后的结果:

深拷贝就是将p指向的对象每一个属性和方法都拷贝到pp指向的对象中,就像copy了一份,使对pp对象进行修改或其他操作对原有的p对象没有影响。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值