为了账号安全,请及时绑定邮箱和手机立即绑定

关于java深拷贝的疑问

关于java深拷贝的疑问

临摹微笑 2019-03-01 11:08:04
下面这段代码中,为什么 //对引用的对象也进行复制 o.p=(Professor)p.clone(); 就能够实现深拷贝呢? class Professor implements Cloneable { String name; int age; Professor(String name,int age) { this.name=name; this.age=age; } public Object clone() { Object o=null; try { o=super.clone(); } catch(CloneNotSupportedException e) { System.out.println(e.toString()); } return o; } } public class Student implements Cloneable { String name; int age; Professor p; Student(String name,int age,Professor p) { this.name=name; this.age=age; this.p=p; } public Object clone() { Student o=null; try { o=(Student)super.clone(); } catch(CloneNotSupportedException e) { System.out.println(e.toString()); } //对引用的对象也进行复制 o.p=(Professor)p.clone(); return o; } public static void main(String[] args) { Professor p=new Professor("wangwu",50); Student s1=new Student("zhangsan",18,p); Student s2=(Student)s1.clone(); s2.p.name="lisi"; s2.p.age=30; //学生1的教授不 改变。 System.out.println("name="+s1.p.name+","+"age="+s1.p.age); System.out.println("name="+s2.p.name+","+"age="+s2.p.age); } }
查看完整描述

4 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

你这个是浅复制,只能复制基本的数据类型,要复制对象成员变量,还需要调用该成员变量的clone方法,我是这么理解的,多次浅复制实现深复制

查看完整回答
反对 回复 2019-03-01
?
郎朗坤

TA贡献1921条经验 获得超9个赞

jdk clone方法的默认实现都是value copy,对于基本类型,就是把copy值。对于引用,就是copy引用所指向的地址。

所以如果没有o.p=(Professor)p.clone();这段代码,那么原对象和clone对象的p,引用的都是同一个Professor对象,也就是浅copy。

查看完整回答
反对 回复 2019-03-01
  • 4 回答
  • 0 关注
  • 436 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信