java深拷贝和浅拷贝

1.浅复制与深复制概念  

⑴浅复制(浅克隆)  
    被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。 

⑵深复制(深克隆)  

    被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。 


2.浅复制与深复制范例

// 浅复制
@Entity
public class Student implements Cloneable {
	String grade;
	People p;

	Student(String grade, People p) {
		this.grade = grade;
		this.p = p;
	}

	public Object clone() {
		Object o = null;
		try {
			o = (Student) super.clone();// Object 中的clone()识别出你要复制的是哪一个对象。
		} catch (CloneNotSupportedException e) {
			System.out.println(e.toString());
		}
		return o;
	}

	public static void main(String[] args) {
		People p = new People("lbc", 26);
		Student s1 = new Student("1", p);
		Student s2 = (Student) s1.clone();
		s2.grade = "2";
		s2.p.age = 0;
		// 修改学生2后,不影响学生1的值。但是P的值同时改变
		System.out.println("grade=" + s1.grade + "," + "age=" + s1.p.age);
		System.out.println("grade=" + s2.grade + "," + "age=" + s2.p.age);
	}
}

class People {
	String name;
	Integer age;

	People(String name, Integer age) {
		this.name = name;
		this.age = age;
	}
}

输出:

grade=1,age=0
grade=2,age=0

从输出可以看出,被复制的对象的值grade改变时互不影响,说明指向不同的对象;而改变说s2中 p的age,s1的值也变化说明指向相同的对象。然后对应开头浅复制的定义:浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。 


//深复制
@Entity
public class Student implements Cloneable {
	String grade;
	People p;

	Student(String grade, People p) {
		this.grade = grade;
		this.p = p;
	}

	@Override
	public Object clone() {
		Student o = null;
		try {
			o = (Student) super.clone();// Object 中的clone()识别出你要复制的是哪一个对象。
		} catch (CloneNotSupportedException e) {
			System.out.println(e.toString());
		}
		o.p = (People) p.clone();
		return o;
	}

	public static void main(String[] args) {
		People p = new People("lbc", 26);
		Student s1 = new Student("1", p);
		Student s2 = (Student) s1.clone();
		s2.grade = "2";
		s2.p.age = 0;
		// 修改学生2后,不影响学生1的值。
		System.out.println("grade=" + s1.grade + "," + "age=" + s1.p.age);
		System.out.println("grade=" + s2.grade + "," + "age=" + s2.p.age);
	}
}

class People implements Cloneable {
	String name;
	Integer age;

	People(String name, Integer age) {
		this.name = name;
		this.age = age;
	}

	@Override
	public Object clone() {
		Object o = null;
		try {
			o = (People) super.clone();
		} catch (CloneNotSupportedException e) {
			System.out.println(e.toString());
		}
		return o;
	}
}
输出:

grade=1,age=26
grade=2,age=0

从输出可以看出,现在s1和s2完全独立互不影响,正如开头定义所说的:深复制把要复制的对象所引用的对象都复制了一遍。


注意:参考http://www.jb51.net/article/62909.htm


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值