java基础:13、clone()的浅拷贝与深拷贝

为什么要使用克隆?

编程过程中,经常会遇到从一个已有的对象A,创造出一个相同的对象B,并且对对象B的改变和修改不会影响到A。仅仅通过简单的赋值操作达不到这个目的,而java提供了Object类的clone()方法满足这个需求。

深拷贝和浅拷贝的举例?

1、浅复制

(1)实现clone的类首先要实现cloneable接口,,实质上是一个标识接口,没有任何接口方法;
(2)在类中重写Object类的clone()方法;
(3)在clone()方法中调用super.clone()方法。
(4)把浅复制的引用指向原型对象新的克隆体。

public class clone {
	public static void main(String[] args) {

		Student s1=new Student();
		Student s2=(Student)s1.clone();
		s2.change();
		System.out.println("s1:"+s1.getA());
		System.out.println("s2:"+s2.getA());
	}
}

class Student implements Cloneable {

	private int a = 0;

	public void change() {
		this.a = 1;
	}

	public int getA() {
		return a;
	}

	public void setA(int a) {
		this.a = a;
	}

	public Object clone() {
		Object o = null;

		try {
			o = (Object) super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}

		return o;
	}
}

2、深复制

当类中只有基本数据类型的时候,采用浅复制就可以了。但是如果有其他数据类型,就需要进行深复制。

实现方法是:在对对象调用clone()方法完成之后,接着对对象之中非基本数据类型的属性也调用clone方法完成深复制。

public class clone {
	public static void main(String[] args) {

		Student s1=new Student();
		Student s2=(Student)s1.clone();
		s2.changeDate();
		System.out.println("s1:"+s1.getDate());
		System.out.println("s2:"+s2.getDate());
	}
}

class Student implements Cloneable {

	private int a = 0;
	private Date date=new Date();

	public void change() {
		this.a = 1;
	}
	
	public void changeDate(){
		this.date.setTime(167878098);
	}

	
	public Date getDate() {
		return date;
	}


	public void setDate(Date date) {
		this.date = date;
	}


	public int getA() {
		return a;
	}

	public void setA(int a) {
		this.a = a;
	}

	public Object clone() {
		Student o = null;

		try {
			o = (Student) super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		o.date=(Date)this.getDate().clone();

		return o;
	}
}

深复制与浅复制如何选择?

(1)检查类中是否有非基本数据类型,如果没有,直接浅复制,返回super.clone即可。
(2)确保类中所有的非基本数据类型的属性都实现了深复制。

深复制和浅复制的区别?

我理解的就是,在clone的时候,
浅复制就是对于基本数据类型实现真正的克隆,非基本数据类型的复制还是指向原来对象的内存地址。
而深复制,是对基本数据类型进行了真正的克隆,并且对非基本数据类型也进行了真正的克隆,建立了新的对象引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值