设为首页 加入收藏

TOP

javaclone方法使用详解
2014-11-23 20:20:35 来源: 作者: 【 】 浏览:24
Tags:javaclone 方法 使用 详解

  为了理解java的clone,有必要先温习以下的知识。


  java的类型,java的类型分为两大类,一类为primitive,如int,另一类为引用类型,如String,Object等等。


  java引用类型的存储,java的引用类型都是存储在堆上的。


  Java代码


  public class B {


  int a;


  String b;


  public B(int a, String b) {


  super();


  this.a = a;


  this.b = b;


  }


  }


  对这样一个引用类型的实例,我们可以推测,在堆上它的内存存储形式(除去指向class的引用,锁的管理等等内务事务所占内存),应该有一个int值表示a,以及一个引用,该引用指向b在堆上的存储空间。


  为什么要clone


  恩,因为需要。废话。


  有名的GoF设计模式里有一个模式为原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.


  简单的说就是clone一个对象实例。使得clone出来的copy和原有的对象一模一样。


  插一个简单使用clone的例子,如果一个对象内部有可变对象实例的话,public API不应该直接返回该对象的引用,以防调用方的code改变该对象的内部状态。这个时候可以返回该对象的clone。


  问题来了,什么叫一模一样。


  一般来说,有


  x.clone() != x


  x.clone().getClass() == x.getClass()


  x.clone().equals(x)


  但是这些都不是强制的。


  我们需要什么样的clone就搞出什么样的clone好了。


  一般而言,我们要的clone应该是这样的。copy和原型的内容一样,但是又是彼此隔离的。即在clone之后,改变其中一个不影响另外一个。


  Object的clone以及为什么如此实现


  Object的clone的行为是最简单的。以堆上的内存存储解释的话(不计内务内存),对一个对象a的clone就是在堆上分配一个和a在堆上所占存储空间一样大的一块地方,然后把a的堆上内存的内容复制到这个新分配的内存空间上。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇java序列化Serializable 下一篇Java类装载体系中的隔离性

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: