深层复制与浅层复制(通过clone的方式)

[size=large]深层复制与浅层复制[/size]
深层复制:Java对象的深层复制是指Java对象A本身被复制成新对象B,同时A的属性也是被复制成新对象,赋值到A的各个属性上去,A与B的相同属性都引用到不同的对象。
浅层复制:A与B的属性没有复制成新的属性。比如: 虽然B与A的地址不同,但是B对象的成员对象与A对象对应的成员对象是同一个对象。


[size=large]事例如下:[/size]
[size=large]//手机实体类[/size]
package com.softstome.clone;

import java.io.Serializable;

public class Phone implements Cloneable,Serializable{
private String color;
private String pinpai ; //品牌

private String[] gyss;

public Phone(){

}

public Phone(String color, String pinpai) {
super();
this.color = color;
this.pinpai = pinpai;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getPinpai() {
return pinpai;
}
public void setPinpai(String pinpai) {
this.pinpai = pinpai;
}


public String[] getGyss() {
return gyss;
}

public void setGyss(String[] gyss) {
this.gyss = gyss;
}

@Override
protected Phone clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return (Phone)super.clone();
}

}

[size=large]//学生实体类[/size]
package com.softstome.clone;

import java.io.Serializable;

/*
* 实现Serializable接口是为了通过序列化的方式实现深层复制
*
* 实现Cloneable接口是为了通过 clone的方式实现实现深层复制
* */
public class Student implements Cloneable,Serializable {
private int stid;
private String stname;
private Phone phone;

public Student(){

}

public Student(int stid, String stname,Phone phone) {
super();
this.stid = stid;
this.stname = stname;
this.phone=phone;
}

public int getStid() {
return stid;
}
public void setStid(int stid) {
this.stid = stid;
}
public String getStname() {
return stname;
}
public void setStname(String stname) {
this.stname = stname;
}

public Phone getPhone() {
return phone;
}

public void setPhone(Phone phone) {
this.phone = phone;
}

//重写克隆方法 实现对象的拷贝
@Override
protected Student clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub

Student stu=(Student)super.clone();
//要实现深层赋复制 ,必须要有这一句。(去掉则变成浅层拷贝)
stu.phone=phone.clone();
return stu;
}


}

[size=large]//演示类[/size]
package com.softstome.clone;

public class TestClone {



/*
* 拷贝手机对象
* */

public void testClone1() throws CloneNotSupportedException {
Phone pn=new Phone();
String[] sz={"aa","bb"};
pn.setGyss(sz);


Phone pn1=(Phone)pn.clone();
System.out.println(pn +" "+pn1);
System.out.println(pn.getGyss()+" "+pn1.getGyss());

String[] sz1={"cc","dd"};
pn1.setGyss(sz1);
System.out.println(pn.getGyss()+" "+pn1.getGyss());



}


/*
* 拷贝(克隆)学生对象
* */

public void testClone2() throws CloneNotSupportedException{

Student stu=new Student(1,"张三",new Phone("红色", "三星"));
Student stu1=(Student)stu.clone();

stu.setStname("张三1");
stu.getPhone().setColor("黑色");
System.out.println(stu.getStid()+" "+stu.getStname()+" " +stu.getPhone().getColor());
System.out.println(stu1.getStid()+" "+stu1.getStname()+" "+stu1.getPhone().getColor());
System.out.println(stu+" "+stu.getPhone());
System.out.println(stu1+" "+stu1.getPhone());


}


public static void main(String[] args) throws CloneNotSupportedException {
TestClone test= new TestClone();
test.testClone1();
//test.testClone2();
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值