对象的浅克隆与深克隆

首先咱们要知道为何要进行对象克隆,我认为最大好处就是提升了效率,你想一想用一个对象须要new一次的效率是很是低的。java

这是基本的关于面向对象的问题,涉及到java内存模型。ide

若是一个类包含的属性都是基本数据类型以及string,integer类型的话,须要用到对象克隆就直接用=就能够,这些数据类型不涉及到栈内存。this

class Person implements Cloneable{
	private int num;
	private String name;
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return "Person [num=" + num + ", name=" + name + "]";
	}
	@Override
	public Person clone(){
		Person p = null;
		try {
			p = (Person) super.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated cch block
			e.printStackTrace();
		}
		return p;
	}
	
}

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Person p = new Person();
		p.setNum(1);
		p.setName("p");

		Person pc = p.clone();
		pc.setName("pc");
		System.out.println(p);
		System.out.println(pc);
	}

}

这是浅克隆,没什么好说的。code

深克隆就是类中包含引用数据类型的,对象

class Person implements Cloneable{
	private int num;
	private String name;
	private Date date;
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	@Override
	public String toString() {
		return "Person [num=" + num + ", name=" + name + ", date=" + date + "]";
	}
	@Override
	public Person clone(){
		Person p = null;
		try {
			p = (Person) super.clone();
			
			p.date = (Date) date.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated cch block
			e.printStackTrace();
		}
		return p;
	}
	
}

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Person p = new Person();
		p.setNum(1);
		p.setName("p");
		p.setDate(new Date());
		
		Person pc = p.clone();
		pc.getDate().setTime(12333);
		pc.setName("pc");
		System.out.println(p);
		System.out.println(pc);
	}

}

若是没有这一行代码内存

p.date = (Date) date.clone();

在输出时会发现对象PC和P的date属性是一个值,至关于把new date(),从新复制了一遍,而不是指向同一个new date();get

相关文章
相关标签/搜索