克隆Object类
来源:互联网 发布:mastercam新手编程 编辑:程序博客网 时间:2024/04/30 19:57
问:clone()
函数是用来做什么的?
答:clone()
可以产生一个相同的类并且返回给调用者。
问:clone()
是如何工作的?
答:Object
将clone()
作为一个本地方法来实现,这意味着它的代码存放在本地的库中。当代码执行的时候,将会检查调用对象的类(或者父类)是否实现了java.lang.Cloneable
接口(Object
类不实现Cloneable
)。如果没有实现这个接口,clone()
将会抛出一个检查异常()——java.lang.CloneNotSupportedException
,如果实现了这个接口,clone()
会创建一个新的对象,并将原来对象的内容复制到新对象,最后返回这个新对象的引用。
问:怎样调用clone()
来克隆一个对象?
答:用想要克隆的对象来调用clone()
,将返回的对象从Object
类转换到克隆的对象所属的类,赋给对象的引用。这里用代码清单3作一个示例。
代码清单3:克隆一个对象
public
class
CloneDemo
implements
Cloneable {
int
x;
public
static
void
main(String[] args)
throws
CloneNotSupportedException {
CloneDemo cd =
new
CloneDemo();
cd.x =
5
;
System.out.printf(
"cd.x = %d%n"
, cd.x);
CloneDemo cd2 = (CloneDemo) cd.clone();
System.out.printf(
"cd2.x = %d%n"
, cd2.x);
}
}
代码清单3声明了一个继承Cloneable
接口的CloneDemo
类。这个接口必须实现,否则,调用Object的clone()时将会导致抛出异常CloneNotSupportedException
。
CloneDemo
声明了一个int
型变量x
和主函数main()
来演示这个类。其中,main()
声明可能会向外抛出CloneNotSupportedException
异常。
Main()
先实例化CloneDemo
并将x
的值初始化为5。然后输出x
的值,紧接着调用clone()
,将克隆的对象传回CloneDemo
。最后,输出了克隆的x
的值。
编译代码清单3(javac CloneDemo.java
)然后运行(java CloneDemo
)。你可以看到以下运行结果:
cd
.x = 5
cd2.x = 5
问:什么情况下需要覆盖clone()
方法呢?
答:上面的例子中,调用clone()
的代码是位于被克隆的类(即CloneDemo
类)里面的,所以就不需要覆盖clone()
了。但是,如果调用别的类中的clone()
,就需要覆盖clone()
了。否则,将会看到“clone
在Object
中是被保护的”提示,因为clone()
在Object
中的权限是protected
。(译者注:protected
权限的成员在不同的包中,只有子类对象可以访问。代码清单3的CloneDemo
类和代码清单4的Data
类是Object
类的子类,所以可以调用clone()
,但是代码清单4中的CloneDemo
类就不能直接调用Data
父类的clone()
)。代码清单4在代码清单3上稍作修改来演示覆盖clone()
。
- 克隆Object类
- Object类中的clone方法 & 浅克隆和深克隆
- 反射,object克隆
- 深克隆object
- 关于object类的clone方法浅克隆与深度克隆
- Java中Object类的clone()(克隆)方法
- Object.clone()方法引申出的浅克隆、深克隆、java原型模式的实现、不可变类的实现
- 克隆类
- PHP - Manual手册 - 第19章 类与对象(PHP 5)- Object cloning对象克隆
- java 反序列化深度克隆Object
- 关于Object.clone克隆方法的测试
- 面试题分析:7JAVA中Object的clone方法详解-克隆-深克隆
- Java基础(二):Object、Class、克隆、异常编程
- deepClone, extend, 深克隆对象和Object.assign(ES6)
- 克隆工具类
- ClonableObject-克隆类
- Java类的克隆
- java克隆类
- centOS安装
- stl set容器——ny86找球号(一)
- java process 不会关闭的解决方法
- C#处理json中的特殊符号
- Android网络检测
- 克隆Object类
- 求素数
- net use命令详解
- 图解WebSphere 8.5 安装
- 零基础学习安卓【笔记 02 Activity学习】
- AtomicLong的incrementAndGet()
- Handler,MessageQueue,Looper解析
- 不使用临时变量交换数值
- linux中getopts与shift的冲突之处