依然是讲自己学习中关于深复制与浅复制的概念

关于深复制,是对一个简单数据类型或者引用数据类型的复制(clone()函数的使用)。在浅复制的时候,复制的是简单类型的值,对引用类型,我们复制的只是引用对象的一个引用值(甚至可以理解为该引用对象在栈中的地址值),在浅复制之后,我们对我们克隆后的对象进行操作,其实就是直接通过该引用地址值对原始拷贝对象的操作。例如:浅复制:

class student implements Cloneable

{

  int  age;

String name;

professor professor;

public student(int age,String name,professor p)

{

this.age = age;

this.name = name;

this.professor = p;

}

student clone()

{

student o = null;

try{

o = (student)super.clone();

}

catch(Exception e)

{

system.out.println(e.toString());

}

return o;

}

public static void main(String [] args)

{

professor p = new professor(40,"lishali");

student stu1 = new student(18,"zhangsan",p);

student stu2 = stu1.clone();

stu2.p.name = "lisi";

sut2.p.age = 12;

system.out.println("stu1.p.name="+stu1.p.name+",stu1.p.age="+stu1.p.age);

}

}

class professor implements Cloneable

{

int age;

String name;

public professor(int age,String name)

{

this.age = age;

this.name = name;

}

}

以上程序运行的结果为:stu1.p.name = lisi,stu1.p.age =12;

然而在我们重写professor类中的clone方法之后,我们就可以做到深复制了,复制的不再只是student中professor对象的引用地址值,而是其真实的内容拷贝。

深复制:

class student implements Cloneable

{

  int  age;

String name;

professor professor;

public student(int age,String name,professor p)

{

this.age = age;

this.name = name;

this.professor = p;

}

student clone()

{

student o = null;

try{

o = (student)super.clone();

}

catch(Exception e)

{

system.out.println(e.toString());

}

o.professor = professor.clone();

return o;

}

public static void main(String [] args)

{

professor p = new professor(40,"lishali");

student stu1 = new student(18,"zhangsan",p);

student stu2 = stu1.clone();

stu2.p.name = "lisi";

sut2.p.age = 12;

system.out.println("stu1.p.name="+stu1.p.name+",stu1.p.age="+stu1.p.age);

}

}

class professor implements Cloneable

{

int age;

String name;

public professor(int age,String name)

{

this.age = age;

this.name = name;

}

professor clone()

{

professor o = null;

try{

o = (professor)super.clone();

}

catch(Exception e)

{

system.out.println(e.toString());

}

return o;

}

}

以上程序运行的结果为:stu1.p.name = lishali,stu1.p.age=40;

克隆对于String类又存在一些特殊:按我们的理解String类在Java中也是属于引用型的变量,如果我们不再重写String类的clone()方法,那我们复制也是一种浅复制,如果修改克隆String对象,其原始克隆本对象的内容也会发生改变。其实并不是这样的,在String类中没有clone()方法,在实现对String变量的改变时,编译器重新给一个String变量申请一个空间,然后将其地址引用值赋值给克隆对象,克隆本对象并不会因为该克隆而发生变化。例如:在上面的代码中如果:

stu2.name = "wangwu";

stu2.age = 23;

其实并不会对stu1中name和age产生影响,只是编译器重新给“wangwu”重新分配了一个堆空间,然后将该空间的引用地址值赋值给了stu2,而不会对stu1中的name产生任何影响。对于int型的,肯定是会重新赋值(因为其并不是引用型变量)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值