Java中clone方法以及深复制和浅复制

Java中处理基本数据类型(如:int , char , double等),都是采用按值传递的方式执行,除此之外的其他类型都是按照引用传递(传递的是一个对象的引用)的方式执行。对象在函数调用时和使用“=”赋值时都是引用传递。

Java中clone方法的作用是为了在现实编程中解决这样一个问题:

从某个已有的对象A创建出另外一个与A具有相同状态的对象B,并且对B的修改不会影响到对象A。

Java中所有的类都继承自Object类,该类中有一个clone方法,那么我们如何使用clone()方法呢?具体步骤如下:

1.实现clone的类,首先要继承Cloneable接口。Cloneable接口实质上是一个标志接口,没有任何接口方法;

2.在类中重写clone()方法;

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

4.把浅复制的引用指向原型对象新的克隆体;

对上面的例子,引入clone()方法如下:

package com.JinLing.demo1;
//浅复制例子

class Obj implements Cloneable{
	private int aInt = 0;
	public int getaInt() {
		return aInt;
	}
	public void setaInt(int aInt) {
		this.aInt = aInt;
	}
	public void changeInt(){
		this.aInt = 1;
	}
	public Object clone(){
		Object o = null;
		try {
			o =  (Obj)super.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return o;
	}
}
public class Demo3 {

	public static void main(String[] args) {
		Obj a = new Obj();
		Obj b = (Obj) a.clone();
		b.changeInt();
		System.out.println("a:"+a.getaInt());		
		System.out.println("b:"+b.getaInt());
		
	}

}
程序执行的结果:

a:0
b:1

但是当类中包含了一些对象时,就需要用到深复制,实现方法是对对象调用clone()方法完成复制之后,接着对对象中的非基本数据类型也调用clone()方法完成深复制。eg:

//深复制的例子
class Obj implements Cloneable{
	 Date birth = new Date();
	
	
	public Date getBirth() {
		return birth;
	}
	public void setBirth(Date birth) {
		this.birth = birth;
	}
	public void changeDate(){
		this.birth.setMonth(4);
	}
	public Object clone(){
		Object o = null;
		try {
			o =  (Obj)super.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//实现深复制
		birth = (Date)this.getBirth().clone();
		return o;
	}
}
public class Demo3 {

	public static void main(String[] args) {
		Obj a = new Obj();
		Obj b = (Obj) a.clone();
		b.changeDate();
		System.out.println("a:"+a.getBirth());		
		System.out.println("b:"+b.getBirth());
		
	}

}
运行结果为:

a:Sun Nov 13 10:05:14 CST 2016
b:Fri May 13 10:05:14 CST 2016


问:深复制和浅复制的区别?
答:浅复制是被复制对象的所有变量都含有与原来对象相同的值,而所有对其他对象的引用仍然指向原来的对象。

深复制是被复制对象的所有变量都含有与原来对象相同的值,那些引用变量将指向被复制的新对象,而不再是原有的那些被引用的对象。深复制是把复制的对象所引用的对象都复制了一边。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值