关于Java克隆的简单记录

来源:互联网 发布:linux查看组内用户 编辑:程序博客网 时间:2024/06/05 08:01

浅克隆与深克隆

浅克隆: 
只负责克隆按值传递的数据(比如基本数据类型、String类型),而不复制它所引用的对象,换言之,所有的对其他对象的引用都仍然指向原来的对象。 
也就是说如果被克隆的对象中,有对其他对象的引用,那么就只复制那个对象的引用,而不是重新复制一个新的对象。 
在上面的例子中,Student对象中具有对Book的引用,那么在使用浅克隆时(使用Clone()方法),复制的s1的book和原来的book是同一个对象,所以s.getBook() ==s1.getBook() 返回 true。

深克隆: 
除了浅度克隆要克隆的值外,还负责克隆引用类型的数据。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深度克隆把要复制的对象所引用的对象都复制了一遍,而这种对被引用到的对象的复制叫做间接复制。 
深克隆的方法有,反序列化,重写Clone()方法等。在上述例子中,就使用了序列化和反序列化的手段。由此,s.getBook() ==s1.getBook() 返回 false。

利用序列化实现深度克隆 
把对象写到流里的过程是序列化(Serialization)过程;而把对象从流中读出来的过程则叫反序列化(Deserialization)过程。应当指出的是,写到流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。 
在序列化一个对象时,应该先实现Serializable接口,然后把对象(实际是对象的拷贝)写到流里面,然后再从流里面反序列化出来,这样就重新创建了一个对象。 
使用这个方法有一个前提,那就是要克隆的对象所引用的所有对象都应该是可序列化的,那么如果遇到不可序列化的对象时应该怎么办哪? 
这时就要用到transient关键字了(注意:transient只能修饰变量),被transient修饰的变量在序列化时不会被序列化。在上述的例子中,Student的age变量使用了transient关键字修饰,所以我们可以看到s.getAge()的值为12,而s2.getAge()的值为0(int类型默认值为0)

原创粉丝点击