Object对象的通用方法-clone
来源:互联网 发布:淘宝怎样开通花呗支付 编辑:程序博客网 时间:2024/05/29 11:35
什么是clone?
GoF设计模式里有一个模式为原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.
简单的说就是clone一个对象实例。使得clone出来的copy和原有的对象一模一样。clone方法的通用约定非常弱,一般的含义是,对任何对象x,表达式:
x.clone() != x
x.clone().getClass() == x.getClass()
x.clone().equals(x)
但是这些都不是绝对的要求。我们的克隆是:创建它的类的新实例,同时拷贝内部的数据结构。
Object的clone:
堆上的内存存储解释的话(不计内务内存),对一个对象a的clone就是在堆上分配一个和a在堆上所占存储空间一样大的一块地方,然后把a的堆上内存的内容复制到这个新分配的内存空间上。
Object的clone是将对象简单的实行域对域的copy,实例中仅仅拷贝了一个对User的引用,还是指向的同一User对象。即:Shallow clone -默认的浅克隆
为什么需要浅copy?
- 效率和简单性,简单的copy一个对象在堆上的的内存比遍历一个对象网然后内存深copy明显效率高并且简单。
- 不给别的类强加意义。如果A实现了Cloneable,同时有一个引用指向B,如果直接复制内存进行深copy的话,意味着B在意义上也是支持Clone的,但是这个是在使用B的A中做的,B甚至都不知道。破坏了B原有的接口。
- 有可能破坏语义。如果A实现了Cloneable,同时有一个引用指向B,该B实现为单例模式,如果直接复制内存进行深copy的话,破坏了B的单例模式。
- 方便且更灵活,如果A引用一个不可变对象,则内存deep copy是一种浪费。Shadow copy给了程序员更好的灵活性。
怎样去实现clone?
- 声明实现Cloneable接口。 否则会抛出CloneNotSupportedException
- 调用super.clone拿到一个对象,如果父类的clone实现没有问题的话,在该对象的内存存储中,所有父类定义的field都已经clone好了,该类中的primitive和不可变类型引用也克隆好了,可变类型引用都是浅copy。
- 把浅copy的引用指向原型对象新的克隆体。(拷贝任何包含内部"深层结构"的可变对象,并用指向新对象的引用代替原来指向这些对象的引用)
- 注:shallow clone还是deep clone主要取决于对象的域是什么性质的。如果是基本类型或不可变引用类型(如:String),就应该用shallow clone,其他引用类型用deep clone
0 0
- Object对象的通用方法-clone
- Object的clone方法
- Object 的clone方法
- Object的clone方法
- Object对象的通用方法-equals、hashCode
- Java Object的clone方法
- 为什么调用Object的clone方法却可以使得自己类中的对象被clone呢?
- Java Object对象之clone方法
- Java Object对象之clone方法
- Java Object对象之clone方法
- js object对象赋值bug和对象复制clone方法
- Effective Java 对于所用对象都通用的方法 11.谨慎地覆盖clone
- C# 关于Object的Clone方法
- 关于Object.clone克隆方法的测试
- Cloneable接口和Object的clone()方法
- 详解java中Object的clone方法
- js clone对象的方法
- Object.clone()方法
- 第五周上机实践项目——三角形类的构造函数(3)
- JavaScript中的new的使用方法与注意事项
- eclipse 设置默认的工程编码格式
- eclipse code template and code Formatter
- 应用之间跳转的问题
- Object对象的通用方法-clone
- java调用远程url并接收其返回的xml或json
- C++ explicit 关键字用法
- Qt中自定义文件格式,读写二进制文件的串行化类的使用
- SiteMesh 2学习(1):入门简介和简单实例
- IAP一个实例---LPC2214的IAP实现方案
- dbca创建数据库报ORA-00443
- android onNewIntent使用详解
- ASP.NET页面错误处理