java clone和深度复制和浅复制的个人总结

1.clone() 和“=”的比较

在基本类型变量里的赋值如: int  a = 1;int b = a;a与b有相同的值,改变a或b的值不影响彼此。

但对象间的:

java.util.Date date1 = new java.util.Date();java.util.Date date2 = date1;

date1 与date2指向相同的对象,指向相同的存储空间。就像小明的外号叫明明,小明和明明都指向同一个人。可以通过改变date1 或date2 的值,都会使对象发生改变。

使用clone就是区别于上面的引用复制。

java.util.Date date1 = new java.util.Date();java.util.Date date2 = (java.util.Date)date1.clone;

date1 与date2指向不相同的对象,但数据是相同的,就像是两个衣着相同的不同的人。date1 与date2间的操作互不影响,他们有各自的存储空间。可见,通过date1.clone()为date3 new了一个对象。

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		java.util.Date date1 = new java.util.Date();
		java.util.Date date2 = date1;
		java.util.Date date3 =(java.util.Date) date1.clone();
		System.out.println("date1 == date2?"+(date1 == date2));
		System.out.println("date1 == date2?"+(date1 == date3));
		
	}

}
输出结果:date1 == date2    true(使用“=”)
                    date1 == date3    false(使用clone())

2.clone()和Cloneable接口。

所有类都默认继承了object类,object 类中定义有clone()方法,返回类型:object,修饰符为protect ,子类可用。所以无法对类的变量直接使用clone方法(如:定义了某个类Student,声明变量aStudent并创建了对象,但无法使用aStudent.clone())。
实现clone()的方法:要通过类中重写clone的方法,修饰符改为public。除此之外,还必须实现Cloneable接口,否则会抛出异常(详细看别人的总结 http://onlylove.iteye.com/blog/265113,我水平还不行,借鉴学习  )。上面的Date类可以直接使用clone()方法,是因为默认实现了Cloneable,另外还有ArrayList,Calendar类可直接使用。

class Student implements Cloneable {
	int number;
	String name;
	
	@Override
	public Object clone() throws CloneNotSupportedException{
		return super.clone();
	}
}
Student 类实现了接口,有克隆的方法。

3.clone()的深浅复制。

在一个类中,如果数据域全都是基本类型,无需考虑深浅复制。

如果数据域含有对象,则考虑深浅复制的问题了。

class Student implements Cloneable {
int number;
String name;
java.util.Date date;

    @Override
	public Object clone() throws CloneNotSupportedException{
		return super.clone();
	}

}

该类中有Date类的对象,如果直接使用上面的方法实现clone(),基本类型的变量都还是实现clone,但类型为对象的date1克隆的只是个引用。
Student student1 = new Student();
Student student2 = student1.clone();
比较:
student1.number == student2.number      false
student1.name == student2.name             false
student1.date == student2.date                 true
  这就是 浅复制,date 并没有实现克隆,而是复制了引用。相当于“=”。此时与上面总结1一样,student1 和 student2的date指向同一个对象。

深度复制

深度复制就是实现浅复制中date没有克隆的情况。
将上面的Student类的clone()方法重写:
class Student implements Cloneable {
	int number;
	String name;
	java.util.Date date;

	@Override
	public Object clone() throws CloneNotSupportedException {
		Student studentClone = (Student) super.clone();
		studentClone.date = (java.util.Date) this.date.clone();
		return studentClone;
	}
}
此时
Student student1 = new Student();
Student student2 = student1.clone();
比较:
student1.number == student2.number      false
student1.name == student2.name             false
student1.date == student2.date                 false
实现了该类的深度复制。student1 和 student2的date指向不同一个对象。
(如有错误,欢迎指正~)

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java中,可以通过以下几种方式来实现深度复制: 1.使用序列化和反序列化实现深度复制 使用Java中的序列化和反序列化机制可以实现深度复制。序列化将Java对象转换为字节序列,而反序列化将字节序列转换回Java对象。这种方法需要确保对象及其所有成员变量都是可序列化的。 示例代码: ``` public static Object deepCopy(Object obj) throws IOException, ClassNotFoundException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(obj); oos.flush(); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return ois.readObject(); } ``` 2.使用clone()方法实现深度复制 Java中的clone()方法可以实现对象的复制。但是,如果对象包含其他对象的引用,则这些对象也需要进行复制以实现深度复制。因此,可以在clone()方法中递归复制对象和其成员变量。 示例代码: ``` public class MyClass implements Cloneable { private int id; private MyObject myObject; @Override public Object clone() throws CloneNotSupportedException { MyClass clonedObj = (MyClass) super.clone(); clonedObj.myObject = (MyObject) myObject.clone(); return clonedObj; } } ``` 3.使用第三方库实现深度复制 Java中有许多第三方库可以用于实现深度复制,例如Apache Commons Lang库的SerializationUtils类和Gson库。这些库提供了简单易用的API,可以轻松实现深度复制。 示例代码: ``` // 使用Apache Commons Lang库实现深度复制 MyClass clonedObj = SerializationUtils.clone(obj); // 使用Gson库实现深度复制 Gson gson = new Gson(); MyClass clonedObj = gson.fromJson(gson.toJson(obj), MyClass.class); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值