天天看点

Java:关于深复制与浅复制

为什么会有深复制和浅复制这两个概念呢?首先,我们想一下,对于基本数据类型,jvm采用的值传递;对于引用类型,JVM采用的是地址传递。我们设想 有这么一段程序:

Obj a=new Obj();

Obj b=a;

显然,在这里,引用变量a和b,都指向了同一个对象,任意改变a或者b,都将会使对方发生相同的改变。那么如果我们只想改变a而不想改变b,怎么办呢?这里就需要我们的浅复制和深复制。

如果Obj类里面只有基本数据类型的话,我们只需要进行浅复制,若有引用类型的话,亦需进行深复制。

浅复制和深复制的主要区别就在于,被复制对象的 引用类型对象和复制对象的引用类型对象仍然是同一个对象;而深复制实现了不仅基本类型,而且引用类型都不再是原来的变量或者对象。

那么如何进行浅复制和深复制?

1.实现clone()的类首先要实现cloneable接口

2.重写clone()方法

3.在clone()中调用super.clone()方法

4.把浅复制的引用只想原型对象新的克隆体。

5.完成浅复制后,对对象或者能够引用类型的属性也调用clone()方法完成深复制。

demo如下:

import java.util.Date;

//java 中clone方法,深复制与浅复制
public class clone {
	public static void main(String args[]) {
		Obj a=new Obj();
		Obj b=(Obj)a.clone();
		System.out.println(a.getName());
		a.setName("tom");
		System.out.println(b.getName());
		int i=1;
		int j=i;
		i=i+11;
		System.out.println(j);
	}

}
class Obj implements Cloneable{//实现cloneable
	private int age;
	private String name;
	private Date birth=new Date();

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Date getBirth() {
		return birth;
	}

	public void setBirth(Date birth) {
		this.birth = birth;
	}
	public Object clone() {//重写clone()
		Obj o=null;
		try {
			o=(Obj)super.clone();//先对基本类型进行浅复制:     调用父类的super(),注意强制转换,
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		o.birth=(Date)this.getBirth().clone();//然后对非基本类型实现深复制,对每一个对象调用clone()方法
		return o;
	}
	
}