Java 的浅拷贝 和 深拷贝

今天想去了解一下java常用的几大类,里面的一些方法的原理的时候,发现一个以前师弟问我的问题,但是很尴尬,我没回答上来。现在在看Object类的时候,发现了clone()这个方法,想起来那时候师弟问我的java对象的深拷贝…现在才来填坑

//object类里面的源代码
protected native Object clone() throws CloneNotSupportedException;

在讲解之前,我们先来了解一个场景:

假设我们现在有一个Student对象,Student stu1=new Student(“张三”,“高一”);
通常我们会通过这个stu1对象给另外一个对象赋值,Student stu2=stu1;
这时候我们只是简单的copy了一下而已,实际上,当你更改stu2的name的时候,stu1的name也会收到影响,这在我们看来是不想要的,那么,这时候就需要我们的clone()方法了,但是使用这个方法的前提是,被拷贝的类,要实现Cloneable接口,如果没实现这个接口,会抛出CloneNotSupportedException异常

那么现在问题来了,为什么我们使用 Student stu2=stu1;在更改stu2的name的时候,stu1的name会更改呢?
在我的理解看来,就像学习C++那时候讲的,只是给stu1起了一个别名stu2,其实他们指向的都是同一个东西。

那现在新的问题又出现了,当我们的Student类的属性只有基本数据类型的时候,通过clone()方法产生的对象stu2和原对象stu1是不相关的,但是我们Student的属性里面又包含了其他类,例如:

Class Student implements Cloneable{
	private String name;
	private String level;
	private Departmet dept;
}
Class Departmet {
	private String name;
	private String info;
}

这样,当我们在直接使用Student stu2=stu1.clone(); 创建stu2对象的时候,name和level是互不相关的,但是Departmet还是指向同一个东西,那么我们要怎么做呢?
其实我们直接使用clone()方法就是浅拷贝,当我们的类只有基本数据类型的时候,浅拷贝是可以了的,但是当我们的属性里面又包含了其他类,这时候,就要使用深拷贝了。

那么我们怎么实现深拷贝呢?
我们可以重写clone()方法,clone()方法里面对Departmet也做一次拷贝。

Class Student implements Cloneable{
	private String name;
	private String level;
	private Departmet dept;
	
 	public Object clone() throws CloneNotSupportedException  {  
 		Student cloned = (Student)super.clone();
 		cloned.dept=(Departmet)dept.clone();
 		return cloned ;
 	}
}

这样,深拷贝就完成了,是不是听起来很高大上,其实也就那点东西。
文章参考:https://www.cnblogs.com/zhangyinhua/p/7715486.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值