如何理解java中的浅拷贝和深拷贝

我们并不希望在编程中遇到浅拷贝,那么,怎么做到深拷贝呢

浅拷贝,也就是在拷贝构造中存在引用赋值,出现捆绑现象,而捆绑会使我们的数据出现一系列的问题

 比如这里有一个Person类:

public class Person {
	private String name;
	private MyDate birth;
	
	public Person(String name, MyDate birth) {
		this.name = name;
		this.birth = birth;
	}
	/*//方法1
	public Person( Person p){
		this.name = p.name; //基本数据类型,值拷贝
		this.birth = p.birth;  //☆引用赋值必捆绑 --地址拷贝
	}*/
	//方法2
	public Person( Person p){
		this.name = p.name; //基本数据类型,值拷贝
		this.birth = new MyDate(p.birth);  //☆引用赋值必捆绑 --地址拷贝
	}
}

Person需要一个MyDate类:

public class MyDate {
	private int year;//年
	private int month;//月
	private int day;//日
	
	public MyDate(int year, int month, int day) {
		this.year = year;
		this.month = month;
		this.day = day;
	}
	
	public MyDate() {
		this(1970,1,1); 
	}
	
	public MyDate(MyDate d) {
		this(d.year,d.month,d.day); 
	}
}

当我们使用方法1的使用会出现捆绑现象,而使用方法2就不会

如果拷贝的内容含有对象,那么就会出现捆绑,我先前也有写过关于引用赋值必捆绑的博文

这里再上一张图来讲解:

当我们拷贝一个对象的时候,需要一直深入到每一个对象的基本数据类型,方法是拷贝的时候new一个对象,具体可以再斟酌上面的代码


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java浅拷贝(Shallow Copy)和深拷贝(Deep Copy)是用于复制对象的两种不同方式。 浅拷贝是创建一个新对象,并将原始对象的非静态字段的值复制到新对象。新对象和原始对象的引用类型字段将引用相同的对象。换句话说,浅拷贝只复制对象的引用,而不是对象本身。 深拷贝是创建一个新对象,并将原始对象的所有字段的值复制到新对象,包括引用类型字段。这意味着在深拷贝,即使原始对象的引用类型字段引用相同的对象,新对象也将有自己的副本。 为了实现浅拷贝,可以使用`clone()`方法。这个方法是`Object`类的一个方法,需要在要复制的类实现`Cloneable`接口。然后,可以使用`clone()`方法来创建一个新对象,它将具有与原始对象相同的字段值。 要实现深拷贝,可以通过以下几种方式之一: 1. 使用序列化和反序列化:将对象写入字节流并读取回来,这将创建一个与原始对象相同但独立的新对象。 2. 使用拷贝构造函数或拷贝工厂方法:在类定义一个构造函数或静态工厂方法,它接受另一个对象作为参数,并复制其字段值到新对象。 3. 递归复制对象的所有引用类型字段:对于每个引用类型字段,创建一个新对象并复制其字段值。 需要注意的是,深拷贝可能会导致性能开销较大,尤其是在对象图很大或存在循环引用的情况下。因此,在进行深拷贝时,需要仔细考虑其对性能的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值