对象克隆

对象克隆 :clone

先观察以下代码

class A{
	private int k;
	public int getK() {
		return k;
	}
	public void setK(int k) {
		this.k = k;
	}
	public A(int k){
		this.k = k;
	}
	
}
public class Test16 {
	public static void main(String[] args){
		
		A a = new A(3);
		A b = a;
		b.setK(4);
		System.out.println(a.getK());
		System.out.println(b.getK());
	}	
}

我们会发现这样将a引用赋值给b引用,并没有起到真正克隆的作用,它只是将b指向了a指向的那块内存中,所以改变b里的值,a也会被改变。

所以我们需要用到clone()来进行对象的克隆 


诶??现在又发现了没有clone这个方法,用这个方法会报错。

所以我们要对clone这个方法进行重写

但是运行时又会报异常


这是因为这个类没有实现 Cloneable这个接口

我们通过查看源码发现


这个接口是个空接口!!

作用:标志位  flg 当前对象是否进行clone 如果不实现 JVM无法实现   

class Money{
	double money = 10.0;
	
}

class Person implements Cloneable{
	public String name;
	Money m;
	public Person(String name){
		this.name = name;
		m = new Money();
	}
	@Override
	protected Object clone() throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		//Person 重写
		Person p = (Person)super.clone();
		return p;
	}
	
}	

public class Test16 {
	public static void main(String[] args) throws CloneNotSupportedException{
		Person p1 = new Person("caocao");
		Person p2 =(Person) p1.clone();		
		System.out.println(p1.m.money);
		System.out.println(p2.m.money);
		
		p1.m.money = 1000.0;
		
		System.out.println(p1.m.money);
		System.out.println(p2.m.money);
	}	
}

运行结果


我们发现这个改变了p2的值对应p1也变了,这个是因为我们只克隆了person对象,并没有克隆Money对象。因此我们需要在Money类里重写clone方法。

class Money implements Cloneable{
	double money = 10.0;

	@Override
	protected Object clone() throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		return super.clone();
	}
	
}
//Cloneable   空接口(标志接口)
//作用:标志位  flg 当前对象是否进行clone 如果不实现 JVM无法实现   
class Person implements Cloneable{
	public String name;
	Money m;
	public Person(String name){
		this.name = name;
		m = new Money();
	}
	@Override
	protected Object clone() throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		//Person 重写
		Person p = (Person)super.clone();
		p.m = (Money)this.m.clone();
		return p;
	}
}	

public class Test16 {
	public static void main(String[] args) throws CloneNotSupportedException{
		Person p1 = new Person("caocao");
		Person p2 =(Person) p1.clone();
		System.out.println(p1.m.money);
		System.out.println(p2.m.money);
		
		p1.m.money = 1000.0;
		
		System.out.println(p1.m.money);
		System.out.println(p2.m.money);
		
	}	
}

运行结果




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值