对于java中clone()函数的理解
2015-09-23 14:58
330 查看
下面是引用JavaAPI文档部分
引用
protected Object clone()
throws CloneNotSupportedException
创建并返回此对象的一个副本。“副本”的准确含义可能依赖于对象的类。这样做的目的是,对于任何对象 x,表达式:
x.clone() != x
为 true,表达式:
x.clone().getClass() == x.getClass()
也为 true,但这些并非必须要满足的要求。一般情况下:
x.clone().equals(x)
为 true,但这并非必须要满足的要求。
按照惯例,返回的对象应该通过调用 super.clone 获得。如果一个类及其所有的超类(Object 除外)都遵守此约定,则 x.clone().getClass() == x.getClass()。
按照惯例,此方法返回的对象应该独立于该对象(正被复制的对象)。要获得此独立性,在 super.clone 返回对象之前,有必要对该对象的一个或多个字段进行修改。这通常意味着要复制包含正在被复制对象的内部“深层结构”的所有可变对象,并使用对副本的引用替换对这些对象的引用。如果一个类只包含基本字段或对不变对象的引用,那么通常不需要修改 super.clone 返回的对象中的字段。
Object 类的 clone 方法执行特定的复制操作。首先,如果此对象的类不能实现接口 Cloneable,则会抛出 CloneNotSupportedException。注意,所有的数组都被视为实现接口 Cloneable。否则,此方法会创建此对象的类的一个新实例,并像通过分配那样,严格使用此对象相应字段的内容初始化该对象的所有字段;这些字段的内容没有被自我复制。所以,此方法执行的是该对象的“浅表复制”,而不“深层复制”操作。
Object 类本身不实现接口 Cloneable,所以在类为 Object 的对象上调用 clone 方法将会导致在运行时抛出异常。
对java中的clone()感兴趣,看了看java的api文档。并搜索了一些相关资料,做下总结。
1.clone定义
x.clone()!=x的意思是x.clone()返回的对象为新建的对象,与原来的对象地址不同。
x.clone().getClass() == x.getClass()的意思是克隆出的对象与原对象都是同一个类生成的。
x.clone().equals(x)的意思是新的对象与原来的对象相同(在equals()函数下是相同的,所以通常需要覆盖equals()方法)
2.java中clone方法的实现。
首先要实现clone方法的类要实现Cloneable接口,然后实现覆盖clone方法。在Object类中,clone方法定义为
Java代码
protected Object clone() throws CloneNotSupportedExcption
,实现的时候需要改修饰符为public。最后在实现方法的时候按照惯例返回的对象通过调用super.clone获得,这样可以保证x.clone().getClass()
== x.getClass()
最后需要注意的是引用部分红色标注的部分,这是用来实现深拷贝的。
引用
protected Object clone()
throws CloneNotSupportedException
创建并返回此对象的一个副本。“副本”的准确含义可能依赖于对象的类。这样做的目的是,对于任何对象 x,表达式:
x.clone() != x
为 true,表达式:
x.clone().getClass() == x.getClass()
也为 true,但这些并非必须要满足的要求。一般情况下:
x.clone().equals(x)
为 true,但这并非必须要满足的要求。
按照惯例,返回的对象应该通过调用 super.clone 获得。如果一个类及其所有的超类(Object 除外)都遵守此约定,则 x.clone().getClass() == x.getClass()。
按照惯例,此方法返回的对象应该独立于该对象(正被复制的对象)。要获得此独立性,在 super.clone 返回对象之前,有必要对该对象的一个或多个字段进行修改。这通常意味着要复制包含正在被复制对象的内部“深层结构”的所有可变对象,并使用对副本的引用替换对这些对象的引用。如果一个类只包含基本字段或对不变对象的引用,那么通常不需要修改 super.clone 返回的对象中的字段。
Object 类的 clone 方法执行特定的复制操作。首先,如果此对象的类不能实现接口 Cloneable,则会抛出 CloneNotSupportedException。注意,所有的数组都被视为实现接口 Cloneable。否则,此方法会创建此对象的类的一个新实例,并像通过分配那样,严格使用此对象相应字段的内容初始化该对象的所有字段;这些字段的内容没有被自我复制。所以,此方法执行的是该对象的“浅表复制”,而不“深层复制”操作。
Object 类本身不实现接口 Cloneable,所以在类为 Object 的对象上调用 clone 方法将会导致在运行时抛出异常。
对java中的clone()感兴趣,看了看java的api文档。并搜索了一些相关资料,做下总结。
1.clone定义
x.clone()!=x的意思是x.clone()返回的对象为新建的对象,与原来的对象地址不同。
x.clone().getClass() == x.getClass()的意思是克隆出的对象与原对象都是同一个类生成的。
x.clone().equals(x)的意思是新的对象与原来的对象相同(在equals()函数下是相同的,所以通常需要覆盖equals()方法)
2.java中clone方法的实现。
首先要实现clone方法的类要实现Cloneable接口,然后实现覆盖clone方法。在Object类中,clone方法定义为
Java代码
protected Object clone() throws CloneNotSupportedExcption
,实现的时候需要改修饰符为public。最后在实现方法的时候按照惯例返回的对象通过调用super.clone获得,这样可以保证x.clone().getClass()
== x.getClass()
最后需要注意的是引用部分红色标注的部分,这是用来实现深拷贝的。
相关文章推荐
- JAVA问题总结之26-异常处理
- SpringMVC接收数组请求参数小技巧
- spring自定义事件监听
- 我叒玩坏eclipse以后决定把问题记录下来了
- Java之旅Struts系列(2)——Struts1(精华)
- Java 7 中 NIO.2 的使用——第一节 Path 类的使用
- 生产者消费者问题(thinking in java 709 )
- Spring事务配置及事务传播隔离级别
- mysql和eclipse都设置了utf8编码,保存时中文依然乱码
- 根据java编译器规则在Class中搜索匹配指定参数类型表的泛型方法(GenericMethod)
- thriftのjava应用
- Spring MVC Interceptors 如何被调用
- Eclipse中使用Gradle进行打包APK问题总结
- 【Java EE 学习 48】【Hibernate学习第五天】【抓取策略】【二级缓存】【HQL】
- maven多模块eclipse jetty热部署
- 在Jmeter中使用自定义编写的Java测试代码
- java异常的栈轨迹
- Java中的方法重载的参数是以静态类型为依据
- Spring注解Hibernate对象的实例
- Spring AOP解析类