对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方法定义为
protected Object clone() throws CloneNotSupportedExcption
,实现的时候需要改修饰符为public。最后在实现方法的时候按照惯例返回的对象通过调用super.clone获得,这样可以保证x.clone().getClass() == x.getClass()
最后需要注意的是引用部分红色标注的部分,这是用来实现深拷贝的。
注:Object 类本身不实现接口 Cloneable,所以在类为 Object 的对象上调用 clone 方法将会导致在运行时抛出异常。
Java clone详解
http://akalius.iteye.com/blog/155037
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方法定义为
protected Object clone() throws CloneNotSupportedExcption
,实现的时候需要改修饰符为public。最后在实现方法的时候按照惯例返回的对象通过调用super.clone获得,这样可以保证x.clone().getClass() == x.getClass()
最后需要注意的是引用部分红色标注的部分,这是用来实现深拷贝的。
注:Object 类本身不实现接口 Cloneable,所以在类为 Object 的对象上调用 clone 方法将会导致在运行时抛出异常。
Java clone详解
http://akalius.iteye.com/blog/155037