关于clone 和 深度clone

tmhk123 2010-04-16 03:50:23
public Employee clone() throws CloneNotSupportedException
{
// call Object.clone()
Employee cloned = (Employee)super.clone();

// clone mutable fields
cloned.hireDay = (Date)hireDay.clone();

return cloned;
}

如此句 是用的Employee clone 而有的例子我见到是 Object clone ,难道子类和父类都可以?
还有就是浅clone和深度clone到底差别在哪?怎样使非基本变量的变量clone?
请教各位大神
...全文
133 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
tmhk123 2010-04-17
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 justlearn 的回复:]
引用 13 楼 tmhk123 的回复:
引用 10 楼 justlearn 的回复:
就是在重写的clone方法中,除了调用super.clone()
还要调用当前引用的clone()

Java code

class A{
int m;
}

class B{
int i;
A a = new A();
public Object clone() {
B obj……
[/Quote]

崩溃了 难道JAVA没有更好的克隆吗?直接对超级最深层克隆
justlearn 2010-04-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 tmhk123 的回复:]
引用 10 楼 justlearn 的回复:
就是在重写的clone方法中,除了调用super.clone()
还要调用当前引用的clone()

Java code

class A{
int m;
}

class B{
int i;
A a = new A();
public Object clone() {
B obj = null;
try {
obj =……
[/Quote]
对,class A里面还有引用,在这里面也得这么写,如果有一长串类,得写很多,哈哈
tmhk123 2010-04-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 justlearn 的回复:]
就是在重写的clone方法中,除了调用super.clone()
还要调用当前引用的clone()

Java code

class A{
int m;
}

class B{
int i;
A a = new A();
public Object clone() {
B obj = null;
try {
obj = (B……
[/Quote]

嗯 明白了 就是还得声明对变量a的clone吧
qjtttt 2010-04-17
  • 打赏
  • 举报
回复
楼上说的很透彻
justlearn 2010-04-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 justlearn 的回复:]
就是在重写的clone方法中,除了调用super.clone()
还要调用当前引用的clone()

Java code

class A{
int m;
}

class B{
int i;
A a = new A();
public Object clone() {
B obj = null;
try {
obj = (B……
[/Quote]
补充一下类要实现clone借口 implements Cloneable。漏写了
justlearn 2010-04-17
  • 打赏
  • 举报
回复
就是在重写的clone方法中,除了调用super.clone()
还要调用当前引用的clone()

class A{
int m;
}

class B{
int i;
A a = new A();
public Object clone() {
B obj = null;
try {
obj = (B)super.clone();
} catch(CloneNotSupportedException e) {
e.printStackTrace();
}
// 就是这句
obj.a = (A)obj.a.clone();
return obj;
}
}

tmhk123 2010-04-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zfq642773391 的回复:]
http://zzqrj.javaeye.com/blog/572562
这个例子讲的这么详细,怎么会不懂?你哪里感到不解啊
[/Quote]
定义我懂了 默认的是浅克隆吧
但是深克隆是如何实现的?
justlearn 2010-04-17
  • 打赏
  • 举报
回复
class A{}

class B{
int i;
A a = new A();//假设此时a指向的内存地址为@8888
}

如果浅clone B,clone了一个对象b。那么b.A指向的地址还是@8888
如果是深clone,那么b.A会是一个新地址
zfq642773391 2010-04-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 justlearn 的回复:]
浅clone复制的是栈的内容,如果你复制对象中存在对其他对象的引用,它只是复制那个引用,而不会去复制引用指向的对象。
也就是如果a是b的浅clone对象,那么你修改a之内的对象的引用,就会造成b的变化,因为他们都指向同一个对象。

深clone就是彻彻底底的做了一个新对象,a,b完全独立。
[/Quote]
恩 就是这样的
zfq642773391 2010-04-17
  • 打赏
  • 举报
回复
http://zzqrj.javaeye.com/blog/572562
这个例子讲的这么详细,怎么会不懂?你哪里感到不解啊
justlearn 2010-04-17
  • 打赏
  • 举报
回复
浅clone复制的是栈的内容,如果你复制对象中存在对其他对象的引用,它只是复制那个引用,而不会去复制引用指向的对象。
也就是如果a是b的浅clone对象,那么你修改a之内的对象的引用,就会造成b的变化,因为他们都指向同一个对象。

深clone就是彻彻底底的做了一个新对象,a,b完全独立。
tmhk123 2010-04-17
  • 打赏
  • 举报
回复
= =我还是晕啊 谁能具体点给我说说
Nextcccc 2010-04-16
  • 打赏
  • 举报
回复
如此句 是用的Employee clone 而有的例子我见到是 Object clone ,难道子类和父类都可以?

Employee 是 Object的子类,当然可以这么写
zfq642773391 2010-04-16
  • 打赏
  • 举报
回复
http://zzqrj.javaeye.com/blog/572562
看看这个吧 看完这个 你应该就差不多理解了
James.Ji 2010-04-16
  • 打赏
  • 举报
回复
哈哈,又来一个clone的,浅clone不会复制内部的成员变量对象,深度clone会复制内部成员变量

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧