克隆与序列化

  • Java对象的“假”克隆
  • 实例说明

  在实际编程中,会遇到需要进行克隆技术的情况。例如要获得一个非常复杂的对象,与其使用new创建对象在对该对象进行赋值,不如直接克隆现有对象。

  本实例将演示一种常见的错误克隆方法。

  • 关键技术

  Java中,对于今本数据类型可以使用“=”号进行克隆,此时两个变量除了相等以外是没有任何关系的。而对于引用类型是不能简单的使用“=”进行克隆。这与Java的内存空间使用有关。Java将内存空间分成两块,即栈和堆。在栈中保存基本数据类型和引用变量,在堆中保存对象。对于引用变量,使用“=”将修改引用,而不是赋值堆中对象。此时两个引用变量将指向一个对象。因此,如果一个变量对其进行修改则会该变另一个变量。

  提示:通常情况很少使用“=”操作对象,也很少使用“=”比较两个对象。

熟悉Java内存的空间分配

  Java将内存分成两个部分,即栈和堆。在栈中保存基本数据类型和引用变量,在堆中保存对象。对于栈中的变量在使用完之后会立即被回收,这样就可以继续常见其他的变量。而对于堆中的对象,是由虚拟机进行管理的,因此即使该对象已经不再使用,该内存只会在一个不确定的时间被回收。

 


 

  • Java对象的浅克隆
  • 关键技术

  Java中任何一个类都是Object类的直接或间接子类。如果一个类没有超类那么它默认继承自Object类。在Object类中实现了很多有用的方法。当克隆对象时,需要使用clone()方法。

  需要注意的是该方法是一个受保护的方法,通常需要重写该方法并将访问权限限定为public。该方法将类中的各个属性进行复制,如果对于引用类型的属性这种操作就会有问题,因此成为浅克隆。提供克隆功能的类需要实现cloneable接口,否则lone是会抛出异常CloneNotSupportedException。

浅克隆的应用

  对于类中的每个属性,如果只包括基本数据类型或者不可变的引用类型,如String,或者对象在其声明周期内不会发生变化,则可以使用浅克隆来复制对象。

 

 


 

 

  • Java对象的深克隆
  • 关键技术

  当需要克隆对象时,需要使用clone()方法,在默认情况下,该方法实现的浅克隆功能。为了支持可变的引用类型,需要在重写该方法时,将引用类型也进行克隆。这需要引用类型也重写clone()方法。提供克隆的类需要实现Cloneable接口。

 

posted @ 2019-04-08 17:27  Joy丨windy  阅读(229)  评论(0编辑  收藏  举报